Created
May 30, 2019 01:17
-
-
Save WalczRobert/a849dc0b071d7430eefa15afaee01d72 to your computer and use it in GitHub Desktop.
Created on Cognitive Class Labs
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "cells": [ | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "# Segmenting and Clustering Neighborhods in Toronto" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "### Importing lib to get data in required format" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 1, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "import requests\n", | |
| "website_url = requests.get('https://en.wikipedia.org/wiki/List_of_postal_codes_of_Canada:_M').text" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "### I used the BeautifulSoup package to transform the data from the Wikipedia page into a pandas dataframe" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 2, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "<!DOCTYPE html>\n", | |
| "<html class=\"client-nojs\" dir=\"ltr\" lang=\"en\">\n", | |
| " <head>\n", | |
| " <meta charset=\"utf-8\"/>\n", | |
| " <title>\n", | |
| " List of postal codes of Canada: M - Wikipedia\n", | |
| " </title>\n", | |
| " <script>\n", | |
| " document.documentElement.className=document.documentElement.className.replace(/(^|\\s)client-nojs(\\s|$)/,\"$1client-js$2\");RLCONF={\"wgCanonicalNamespace\":\"\",\"wgCanonicalSpecialPageName\":!1,\"wgNamespaceNumber\":0,\"wgPageName\":\"List_of_postal_codes_of_Canada:_M\",\"wgTitle\":\"List of postal codes of Canada: M\",\"wgCurRevisionId\":890001695,\"wgRevisionId\":890001695,\"wgArticleId\":539066,\"wgIsArticle\":!0,\"wgIsRedirect\":!1,\"wgAction\":\"view\",\"wgUserName\":null,\"wgUserGroups\":[\"*\"],\"wgCategories\":[\"Communications in Ontario\",\"Postal codes in Canada\",\"Toronto\",\"Ontario-related lists\"],\"wgBreakFrames\":!1,\"wgPageContentLanguage\":\"en\",\"wgPageContentModel\":\"wikitext\",\"wgSeparatorTransformTable\":[\"\",\"\"],\"wgDigitTransformTable\":[\"\",\"\"],\"wgDefaultDateFormat\":\"dmy\",\"wgMonthNames\":[\"\",\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"],\"wgMonthNamesShort\":[\"\",\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"],\n", | |
| "\"wgRelevantPageName\":\"List_of_postal_codes_of_Canada:_M\",\"wgRelevantArticleId\":539066,\"wgRequestId\":\"XO7PkwpAAD8AAJDPwWMAAAAA\",\"wgCSPNonce\":!1,\"wgIsProbablyEditable\":!0,\"wgRelevantPageIsProbablyEditable\":!0,\"wgRestrictionEdit\":[],\"wgRestrictionMove\":[],\"wgMediaViewerOnClick\":!0,\"wgMediaViewerEnabledByDefault\":!0,\"wgPopupsReferencePreviews\":!1,\"wgPopupsConflictsWithNavPopupGadget\":!1,\"wgVisualEditor\":{\"pageLanguageCode\":\"en\",\"pageLanguageDir\":\"ltr\",\"pageVariantFallbacks\":\"en\"},\"wgMFDisplayWikibaseDescriptions\":{\"search\":!0,\"nearby\":!0,\"watchlist\":!0,\"tagline\":!1},\"wgRelatedArticles\":null,\"wgRelatedArticlesUseCirrusSearch\":!0,\"wgRelatedArticlesOnlyUseCirrusSearch\":!1,\"wgWMESchemaEditAttemptStepOversample\":!1,\"wgPoweredByHHVM\":!0,\"wgULSCurrentAutonym\":\"English\",\"wgNoticeProject\":\"wikipedia\",\"wgCentralNoticeCookiesToDelete\":[],\"wgCentralNoticeCategoriesUsingLegacy\":[\"Fundraising\",\"fundraising\"],\"wgWikibaseItemId\":\"Q3248240\",\"wgCentralAuthMobileDomain\":\n", | |
| "!1,\"wgEditSubmitButtonLabelPublish\":!0};RLSTATE={\"ext.gadget.charinsert-styles\":\"ready\",\"ext.globalCssJs.user.styles\":\"ready\",\"ext.globalCssJs.site.styles\":\"ready\",\"site.styles\":\"ready\",\"noscript\":\"ready\",\"user.styles\":\"ready\",\"ext.globalCssJs.user\":\"ready\",\"ext.globalCssJs.site\":\"ready\",\"user\":\"ready\",\"user.options\":\"ready\",\"user.tokens\":\"loading\",\"ext.cite.styles\":\"ready\",\"mediawiki.legacy.shared\":\"ready\",\"mediawiki.legacy.commonPrint\":\"ready\",\"wikibase.client.init\":\"ready\",\"ext.visualEditor.desktopArticleTarget.noscript\":\"ready\",\"ext.uls.interlanguage\":\"ready\",\"ext.wikimediaBadges\":\"ready\",\"ext.3d.styles\":\"ready\",\"mediawiki.skinning.interface\":\"ready\",\"skins.vector.styles\":\"ready\"};RLPAGEMODULES=[\"ext.cite.ux-enhancements\",\"site\",\"mediawiki.page.startup\",\"mediawiki.page.ready\",\"jquery.tablesorter\",\"mediawiki.searchSuggest\",\"ext.gadget.teahouse\",\"ext.gadget.ReferenceTooltips\",\"ext.gadget.watchlist-notice\",\"ext.gadget.DRN-wizard\",\"ext.gadget.charinsert\",\"ext.gadget.refToolbar\",\n", | |
| "\"ext.gadget.extra-toolbar-buttons\",\"ext.gadget.switcher\",\"ext.centralauth.centralautologin\",\"mmv.head\",\"mmv.bootstrap.autostart\",\"ext.popups\",\"ext.visualEditor.desktopArticleTarget.init\",\"ext.visualEditor.targetLoader\",\"ext.eventLogging\",\"ext.wikimediaEvents\",\"ext.navigationTiming\",\"ext.uls.compactlinks\",\"ext.uls.interface\",\"ext.quicksurveys.init\",\"ext.centralNotice.geoIP\",\"ext.centralNotice.startUp\",\"skins.vector.js\"];\n", | |
| " </script>\n", | |
| " <script>\n", | |
| " (RLQ=window.RLQ||[]).push(function(){mw.loader.implement(\"user.tokens@0tffind\",function($,jQuery,require,module){/*@nomin*/mw.user.tokens.set({\"editToken\":\"+\\\\\",\"patrolToken\":\"+\\\\\",\"watchToken\":\"+\\\\\",\"csrfToken\":\"+\\\\\"});\n", | |
| "});});\n", | |
| " </script>\n", | |
| " <link href=\"/w/load.php?lang=en&modules=ext.3d.styles%7Cext.cite.styles%7Cext.uls.interlanguage%7Cext.visualEditor.desktopArticleTarget.noscript%7Cext.wikimediaBadges%7Cmediawiki.legacy.commonPrint%2Cshared%7Cmediawiki.skinning.interface%7Cskins.vector.styles%7Cwikibase.client.init&only=styles&skin=vector\" rel=\"stylesheet\"/>\n", | |
| " <script async=\"\" src=\"/w/load.php?lang=en&modules=startup&only=scripts&skin=vector\">\n", | |
| " </script>\n", | |
| " <meta content=\"\" name=\"ResourceLoaderDynamicStyles\"/>\n", | |
| " <link href=\"/w/load.php?lang=en&modules=ext.gadget.charinsert-styles&only=styles&skin=vector\" rel=\"stylesheet\"/>\n", | |
| " <link href=\"/w/load.php?lang=en&modules=site.styles&only=styles&skin=vector\" rel=\"stylesheet\"/>\n", | |
| " <meta content=\"MediaWiki 1.34.0-wmf.6\" name=\"generator\"/>\n", | |
| " <meta content=\"origin\" name=\"referrer\"/>\n", | |
| " <meta content=\"origin-when-crossorigin\" name=\"referrer\"/>\n", | |
| " <meta content=\"origin-when-cross-origin\" name=\"referrer\"/>\n", | |
| " <link href=\"android-app://org.wikipedia/http/en.m.wikipedia.org/wiki/List_of_postal_codes_of_Canada:_M\" rel=\"alternate\"/>\n", | |
| " <link href=\"/w/index.php?title=List_of_postal_codes_of_Canada:_M&action=edit\" rel=\"alternate\" title=\"Edit this page\" type=\"application/x-wiki\"/>\n", | |
| " <link href=\"/w/index.php?title=List_of_postal_codes_of_Canada:_M&action=edit\" rel=\"edit\" title=\"Edit this page\"/>\n", | |
| " <link href=\"/static/apple-touch/wikipedia.png\" rel=\"apple-touch-icon\"/>\n", | |
| " <link href=\"/static/favicon/wikipedia.ico\" rel=\"shortcut icon\"/>\n", | |
| " <link href=\"/w/opensearch_desc.php\" rel=\"search\" title=\"Wikipedia (en)\" type=\"application/opensearchdescription+xml\"/>\n", | |
| " <link href=\"//en.wikipedia.org/w/api.php?action=rsd\" rel=\"EditURI\" type=\"application/rsd+xml\"/>\n", | |
| " <link href=\"//creativecommons.org/licenses/by-sa/3.0/\" rel=\"license\"/>\n", | |
| " <link href=\"https://en.wikipedia.org/wiki/List_of_postal_codes_of_Canada:_M\" rel=\"canonical\"/>\n", | |
| " <link href=\"//login.wikimedia.org\" rel=\"dns-prefetch\"/>\n", | |
| " <link href=\"//meta.wikimedia.org\" rel=\"dns-prefetch\"/>\n", | |
| " <!--[if lt IE 9]><script src=\"/w/load.php?lang=qqx&modules=html5shiv&only=scripts&skin=fallback&sync=1\"></script><![endif]-->\n", | |
| " </head>\n", | |
| " <body class=\"mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject mw-editable page-List_of_postal_codes_of_Canada_M rootpage-List_of_postal_codes_of_Canada_M skin-vector action-view\">\n", | |
| " <div class=\"noprint\" id=\"mw-page-base\">\n", | |
| " </div>\n", | |
| " <div class=\"noprint\" id=\"mw-head-base\">\n", | |
| " </div>\n", | |
| " <div class=\"mw-body\" id=\"content\" role=\"main\">\n", | |
| " <a id=\"top\">\n", | |
| " </a>\n", | |
| " <div class=\"mw-body-content\" id=\"siteNotice\">\n", | |
| " <!-- CentralNotice -->\n", | |
| " </div>\n", | |
| " <div class=\"mw-indicators mw-body-content\">\n", | |
| " </div>\n", | |
| " <h1 class=\"firstHeading\" id=\"firstHeading\" lang=\"en\">\n", | |
| " List of postal codes of Canada: M\n", | |
| " </h1>\n", | |
| " <div class=\"mw-body-content\" id=\"bodyContent\">\n", | |
| " <div class=\"noprint\" id=\"siteSub\">\n", | |
| " From Wikipedia, the free encyclopedia\n", | |
| " </div>\n", | |
| " <div id=\"contentSub\">\n", | |
| " </div>\n", | |
| " <div id=\"jump-to-nav\">\n", | |
| " </div>\n", | |
| " <a class=\"mw-jump-link\" href=\"#mw-head\">\n", | |
| " Jump to navigation\n", | |
| " </a>\n", | |
| " <a class=\"mw-jump-link\" href=\"#p-search\">\n", | |
| " Jump to search\n", | |
| " </a>\n", | |
| " <div class=\"mw-content-ltr\" dir=\"ltr\" id=\"mw-content-text\" lang=\"en\">\n", | |
| " <div class=\"mw-parser-output\">\n", | |
| " <p>\n", | |
| " This is a list of\n", | |
| " <a href=\"/wiki/Postal_codes_in_Canada\" title=\"Postal codes in Canada\">\n", | |
| " postal codes in Canada\n", | |
| " </a>\n", | |
| " where the first letter is M. Postal codes beginning with M are located within the city of\n", | |
| " <a href=\"/wiki/Toronto\" title=\"Toronto\">\n", | |
| " Toronto\n", | |
| " </a>\n", | |
| " in the province of\n", | |
| " <a href=\"/wiki/Ontario\" title=\"Ontario\">\n", | |
| " Ontario\n", | |
| " </a>\n", | |
| " . Only the first three characters are listed, corresponding to the Forward Sortation Area.\n", | |
| " </p>\n", | |
| " <p>\n", | |
| " <a href=\"/wiki/Canada_Post\" title=\"Canada Post\">\n", | |
| " Canada Post\n", | |
| " </a>\n", | |
| " provides a free postal code look-up tool on its website,\n", | |
| " <sup class=\"reference\" id=\"cite_ref-1\">\n", | |
| " <a href=\"#cite_note-1\">\n", | |
| " [1]\n", | |
| " </a>\n", | |
| " </sup>\n", | |
| " via its\n", | |
| " <a href=\"/wiki/Mobile_app\" title=\"Mobile app\">\n", | |
| " applications\n", | |
| " </a>\n", | |
| " for such\n", | |
| " <a class=\"mw-redirect\" href=\"/wiki/Smartphones\" title=\"Smartphones\">\n", | |
| " smartphones\n", | |
| " </a>\n", | |
| " as the\n", | |
| " <a href=\"/wiki/IPhone\" title=\"IPhone\">\n", | |
| " iPhone\n", | |
| " </a>\n", | |
| " and\n", | |
| " <a href=\"/wiki/BlackBerry\" title=\"BlackBerry\">\n", | |
| " BlackBerry\n", | |
| " </a>\n", | |
| " ,\n", | |
| " <sup class=\"reference\" id=\"cite_ref-2\">\n", | |
| " <a href=\"#cite_note-2\">\n", | |
| " [2]\n", | |
| " </a>\n", | |
| " </sup>\n", | |
| " and sells hard-copy directories and\n", | |
| " <a href=\"/wiki/CD-ROM\" title=\"CD-ROM\">\n", | |
| " CD-ROMs\n", | |
| " </a>\n", | |
| " . Many vendors also sell validation tools, which allow customers to properly match addresses and postal codes. Hard-copy directories can also be consulted in all post offices, and some libraries.\n", | |
| " </p>\n", | |
| " <h2>\n", | |
| " <span class=\"mw-headline\" id=\"Toronto_-_FSAs\">\n", | |
| " <a href=\"/wiki/Toronto\" title=\"Toronto\">\n", | |
| " Toronto\n", | |
| " </a>\n", | |
| " -\n", | |
| " <a href=\"/wiki/Postal_codes_in_Canada#Forward_sortation_areas\" title=\"Postal codes in Canada\">\n", | |
| " FSAs\n", | |
| " </a>\n", | |
| " </span>\n", | |
| " <span class=\"mw-editsection\">\n", | |
| " <span class=\"mw-editsection-bracket\">\n", | |
| " [\n", | |
| " </span>\n", | |
| " <a href=\"/w/index.php?title=List_of_postal_codes_of_Canada:_M&action=edit&section=1\" title=\"Edit section: Toronto - FSAs\">\n", | |
| " edit\n", | |
| " </a>\n", | |
| " <span class=\"mw-editsection-bracket\">\n", | |
| " ]\n", | |
| " </span>\n", | |
| " </span>\n", | |
| " </h2>\n", | |
| " <p>\n", | |
| " Note: There are no rural FSAs in Toronto, hence no postal codes start with M0.\n", | |
| " </p>\n", | |
| " <table class=\"wikitable sortable\">\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>\n", | |
| " Postcode\n", | |
| " </th>\n", | |
| " <th>\n", | |
| " Borough\n", | |
| " </th>\n", | |
| " <th>\n", | |
| " Neighbourhood\n", | |
| " </th>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M1A\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M2A\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M3A\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/North_York\" title=\"North York\">\n", | |
| " North York\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Parkwoods\" title=\"Parkwoods\">\n", | |
| " Parkwoods\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M4A\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/North_York\" title=\"North York\">\n", | |
| " North York\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Victoria_Village\" title=\"Victoria Village\">\n", | |
| " Victoria Village\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M5A\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Downtown_Toronto\" title=\"Downtown Toronto\">\n", | |
| " Downtown Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Harbourfront_(Toronto)\" title=\"Harbourfront (Toronto)\">\n", | |
| " Harbourfront\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M5A\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Downtown_Toronto\" title=\"Downtown Toronto\">\n", | |
| " Downtown Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Regent_Park\" title=\"Regent Park\">\n", | |
| " Regent Park\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M6A\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/North_York\" title=\"North York\">\n", | |
| " North York\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Lawrence_Heights\" title=\"Lawrence Heights\">\n", | |
| " Lawrence Heights\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M6A\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/North_York\" title=\"North York\">\n", | |
| " North York\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Lawrence_Manor\" title=\"Lawrence Manor\">\n", | |
| " Lawrence Manor\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M7A\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Queen%27s_Park_(Toronto)\" title=\"Queen's Park (Toronto)\">\n", | |
| " Queen's Park\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M8A\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M9A\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Etobicoke\" title=\"Etobicoke\">\n", | |
| " Etobicoke\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a class=\"mw-redirect\" href=\"/wiki/Islington_Avenue\" title=\"Islington Avenue\">\n", | |
| " Islington Avenue\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M1B\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Scarborough,_Toronto\" title=\"Scarborough, Toronto\">\n", | |
| " Scarborough\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Rouge,_Toronto\" title=\"Rouge, Toronto\">\n", | |
| " Rouge\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M1B\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Scarborough,_Toronto\" title=\"Scarborough, Toronto\">\n", | |
| " Scarborough\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Malvern,_Toronto\" title=\"Malvern, Toronto\">\n", | |
| " Malvern\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M2B\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M3B\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/North_York\" title=\"North York\">\n", | |
| " North York\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Don Mills North\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M4B\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/East_York\" title=\"East York\">\n", | |
| " East York\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a class=\"mw-redirect\" href=\"/wiki/Woodbine_Gardens\" title=\"Woodbine Gardens\">\n", | |
| " Woodbine Gardens\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M4B\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/East_York\" title=\"East York\">\n", | |
| " East York\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a class=\"mw-redirect\" href=\"/wiki/Parkview_Hill\" title=\"Parkview Hill\">\n", | |
| " Parkview Hill\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M5B\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Downtown_Toronto\" title=\"Downtown Toronto\">\n", | |
| " Downtown Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Ryerson\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M5B\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Downtown_Toronto\" title=\"Downtown Toronto\">\n", | |
| " Downtown Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Garden District\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M6B\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/North_York\" title=\"North York\">\n", | |
| " North York\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Glencairn\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M7B\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M8B\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M9B\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Etobicoke\" title=\"Etobicoke\">\n", | |
| " Etobicoke\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Cloverdale\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M9B\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Etobicoke\" title=\"Etobicoke\">\n", | |
| " Etobicoke\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a class=\"mw-redirect\" href=\"/wiki/Islington,_Toronto\" title=\"Islington, Toronto\">\n", | |
| " Islington\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M9B\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Etobicoke\" title=\"Etobicoke\">\n", | |
| " Etobicoke\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Martin Grove\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M9B\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Etobicoke\" title=\"Etobicoke\">\n", | |
| " Etobicoke\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Princess_Gardens\" title=\"Princess Gardens\">\n", | |
| " Princess Gardens\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M9B\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Etobicoke\" title=\"Etobicoke\">\n", | |
| " Etobicoke\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a class=\"mw-redirect\" href=\"/wiki/West_Deane_Park\" title=\"West Deane Park\">\n", | |
| " West Deane Park\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M1C\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Scarborough,_Toronto\" title=\"Scarborough, Toronto\">\n", | |
| " Scarborough\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Highland_Creek_(Toronto)\" title=\"Highland Creek (Toronto)\">\n", | |
| " Highland Creek\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M1C\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Scarborough,_Toronto\" title=\"Scarborough, Toronto\">\n", | |
| " Scarborough\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a class=\"mw-redirect\" href=\"/wiki/Rouge_Hill\" title=\"Rouge Hill\">\n", | |
| " Rouge Hill\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M1C\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Scarborough,_Toronto\" title=\"Scarborough, Toronto\">\n", | |
| " Scarborough\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Port_Union,_Toronto\" title=\"Port Union, Toronto\">\n", | |
| " Port Union\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M2C\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M3C\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/North_York\" title=\"North York\">\n", | |
| " North York\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Flemingdon_Park\" title=\"Flemingdon Park\">\n", | |
| " Flemingdon Park\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M3C\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/North_York\" title=\"North York\">\n", | |
| " North York\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Don Mills South\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M4C\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/East_York\" title=\"East York\">\n", | |
| " East York\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a class=\"mw-redirect\" href=\"/wiki/Woodbine_Heights\" title=\"Woodbine Heights\">\n", | |
| " Woodbine Heights\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M5C\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Downtown_Toronto\" title=\"Downtown Toronto\">\n", | |
| " Downtown Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/St._James_Town\" title=\"St. James Town\">\n", | |
| " St. James Town\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M6C\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " York\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a class=\"mw-redirect\" href=\"/wiki/Humewood-Cedarvale\" title=\"Humewood-Cedarvale\">\n", | |
| " Humewood-Cedarvale\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M7C\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M8C\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M9C\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Etobicoke\" title=\"Etobicoke\">\n", | |
| " Etobicoke\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Bloordale Gardens\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M9C\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Etobicoke\" title=\"Etobicoke\">\n", | |
| " Etobicoke\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Eringate\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M9C\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Etobicoke\" title=\"Etobicoke\">\n", | |
| " Etobicoke\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Markland_Wood\" title=\"Markland Wood\">\n", | |
| " Markland Wood\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M9C\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Etobicoke\" title=\"Etobicoke\">\n", | |
| " Etobicoke\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Old Burnhamthorpe\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M1E\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Scarborough,_Toronto\" title=\"Scarborough, Toronto\">\n", | |
| " Scarborough\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Guildwood\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M1E\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Scarborough,_Toronto\" title=\"Scarborough, Toronto\">\n", | |
| " Scarborough\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Morningside,_Toronto\" title=\"Morningside, Toronto\">\n", | |
| " Morningside\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M1E\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Scarborough,_Toronto\" title=\"Scarborough, Toronto\">\n", | |
| " Scarborough\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/West_Hill,_Toronto\" title=\"West Hill, Toronto\">\n", | |
| " West Hill\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M2E\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M3E\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M4E\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/East_Toronto\" title=\"East Toronto\">\n", | |
| " East Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/The_Beaches\" title=\"The Beaches\">\n", | |
| " The Beaches\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M5E\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Downtown_Toronto\" title=\"Downtown Toronto\">\n", | |
| " Downtown Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Berczy_Park\" title=\"Berczy Park\">\n", | |
| " Berczy Park\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M6E\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " York\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Caledonia-Fairbanks\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M7E\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M8E\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M9E\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M1G\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Scarborough,_Toronto\" title=\"Scarborough, Toronto\">\n", | |
| " Scarborough\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Woburn,_Toronto\" title=\"Woburn, Toronto\">\n", | |
| " Woburn\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M2G\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M3G\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M4G\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/East_York\" title=\"East York\">\n", | |
| " East York\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Leaside\" title=\"Leaside\">\n", | |
| " Leaside\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M5G\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Downtown_Toronto\" title=\"Downtown Toronto\">\n", | |
| " Downtown Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Central Bay Street\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M6G\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Downtown_Toronto\" title=\"Downtown Toronto\">\n", | |
| " Downtown Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Christie\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M7G\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M8G\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M9G\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M1H\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Scarborough,_Toronto\" title=\"Scarborough, Toronto\">\n", | |
| " Scarborough\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Cedarbrae\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M2H\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/North_York\" title=\"North York\">\n", | |
| " North York\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Hillcrest_Village\" title=\"Hillcrest Village\">\n", | |
| " Hillcrest Village\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M3H\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/North_York\" title=\"North York\">\n", | |
| " North York\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Bathurst_Manor\" title=\"Bathurst Manor\">\n", | |
| " Bathurst Manor\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M3H\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/North_York\" title=\"North York\">\n", | |
| " North York\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Downsview North\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M3H\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/North_York\" title=\"North York\">\n", | |
| " North York\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a class=\"mw-redirect\" href=\"/wiki/Wilson_Heights,_Toronto\" title=\"Wilson Heights, Toronto\">\n", | |
| " Wilson Heights\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M4H\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/East_York\" title=\"East York\">\n", | |
| " East York\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Thorncliffe_Park\" title=\"Thorncliffe Park\">\n", | |
| " Thorncliffe Park\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M5H\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Downtown_Toronto\" title=\"Downtown Toronto\">\n", | |
| " Downtown Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Adelaide\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M5H\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Downtown_Toronto\" title=\"Downtown Toronto\">\n", | |
| " Downtown Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " King\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M5H\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Downtown_Toronto\" title=\"Downtown Toronto\">\n", | |
| " Downtown Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Richmond\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M6H\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/West_Toronto\" title=\"West Toronto\">\n", | |
| " West Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a class=\"mw-redirect\" href=\"/wiki/Dovercourt_Village\" title=\"Dovercourt Village\">\n", | |
| " Dovercourt Village\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M6H\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/West_Toronto\" title=\"West Toronto\">\n", | |
| " West Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Dufferin\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M7H\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M8H\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M9H\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M1J\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Scarborough,_Toronto\" title=\"Scarborough, Toronto\">\n", | |
| " Scarborough\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Scarborough_Village\" title=\"Scarborough Village\">\n", | |
| " Scarborough Village\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M2J\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/North_York\" title=\"North York\">\n", | |
| " North York\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Fairview\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M2J\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/North_York\" title=\"North York\">\n", | |
| " North York\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Henry_Farm\" title=\"Henry Farm\">\n", | |
| " Henry Farm\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M2J\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/North_York\" title=\"North York\">\n", | |
| " North York\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Oriole\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M3J\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/North_York\" title=\"North York\">\n", | |
| " North York\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a class=\"mw-redirect\" href=\"/wiki/Northwood_Park\" title=\"Northwood Park\">\n", | |
| " Northwood Park\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M3J\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/North_York\" title=\"North York\">\n", | |
| " North York\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/York_University\" title=\"York University\">\n", | |
| " York University\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M4J\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/East_York\" title=\"East York\">\n", | |
| " East York\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/East_Toronto\" title=\"East Toronto\">\n", | |
| " East Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M5J\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Downtown_Toronto\" title=\"Downtown Toronto\">\n", | |
| " Downtown Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Harbourfront East\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M5J\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Downtown_Toronto\" title=\"Downtown Toronto\">\n", | |
| " Downtown Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Toronto_Islands\" title=\"Toronto Islands\">\n", | |
| " Toronto Islands\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M5J\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Downtown_Toronto\" title=\"Downtown Toronto\">\n", | |
| " Downtown Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Union_Station_(Toronto)\" title=\"Union Station (Toronto)\">\n", | |
| " Union Station\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M6J\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/West_Toronto\" title=\"West Toronto\">\n", | |
| " West Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Little_Portugal,_Toronto\" title=\"Little Portugal, Toronto\">\n", | |
| " Little Portugal\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M6J\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/West_Toronto\" title=\"West Toronto\">\n", | |
| " West Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Trinity%E2%80%93Bellwoods\" title=\"Trinity–Bellwoods\">\n", | |
| " Trinity\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M7J\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M8J\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M9J\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M1K\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Scarborough,_Toronto\" title=\"Scarborough, Toronto\">\n", | |
| " Scarborough\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " East Birchmount Park\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M1K\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Scarborough,_Toronto\" title=\"Scarborough, Toronto\">\n", | |
| " Scarborough\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Ionview\" title=\"Ionview\">\n", | |
| " Ionview\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M1K\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Scarborough,_Toronto\" title=\"Scarborough, Toronto\">\n", | |
| " Scarborough\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a class=\"mw-redirect\" href=\"/wiki/Kennedy_Park,_Toronto\" title=\"Kennedy Park, Toronto\">\n", | |
| " Kennedy Park\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M2K\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/North_York\" title=\"North York\">\n", | |
| " North York\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Bayview_Village\" title=\"Bayview Village\">\n", | |
| " Bayview Village\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M3K\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/North_York\" title=\"North York\">\n", | |
| " North York\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/CFB_Toronto\" title=\"CFB Toronto\">\n", | |
| " CFB Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M3K\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/North_York\" title=\"North York\">\n", | |
| " North York\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Downsview East\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M4K\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/East_Toronto\" title=\"East Toronto\">\n", | |
| " East Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " The Danforth West\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M4K\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/East_Toronto\" title=\"East Toronto\">\n", | |
| " East Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Riverdale,_Toronto\" title=\"Riverdale, Toronto\">\n", | |
| " Riverdale\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M5K\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Downtown_Toronto\" title=\"Downtown Toronto\">\n", | |
| " Downtown Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Design_Exchange\" title=\"Design Exchange\">\n", | |
| " Design Exchange\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M5K\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Downtown_Toronto\" title=\"Downtown Toronto\">\n", | |
| " Downtown Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a class=\"mw-redirect\" href=\"/wiki/Toronto_Dominion_Centre\" title=\"Toronto Dominion Centre\">\n", | |
| " Toronto Dominion Centre\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M6K\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/West_Toronto\" title=\"West Toronto\">\n", | |
| " West Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Brockton\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M6K\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/West_Toronto\" title=\"West Toronto\">\n", | |
| " West Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Exhibition_Place\" title=\"Exhibition Place\">\n", | |
| " Exhibition Place\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M6K\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/West_Toronto\" title=\"West Toronto\">\n", | |
| " West Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a class=\"mw-redirect\" href=\"/wiki/Parkdale_Village\" title=\"Parkdale Village\">\n", | |
| " Parkdale Village\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M7K\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M8K\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M9K\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M1L\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Scarborough,_Toronto\" title=\"Scarborough, Toronto\">\n", | |
| " Scarborough\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Clairlea\" title=\"Clairlea\">\n", | |
| " Clairlea\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M1L\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Scarborough,_Toronto\" title=\"Scarborough, Toronto\">\n", | |
| " Scarborough\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Golden_Mile,_Toronto\" title=\"Golden Mile, Toronto\">\n", | |
| " Golden Mile\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M1L\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Scarborough,_Toronto\" title=\"Scarborough, Toronto\">\n", | |
| " Scarborough\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Oakridge,_Toronto\" title=\"Oakridge, Toronto\">\n", | |
| " Oakridge\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M2L\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/North_York\" title=\"North York\">\n", | |
| " North York\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Silver Hills\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M2L\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/North_York\" title=\"North York\">\n", | |
| " North York\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/York_Mills\" title=\"York Mills\">\n", | |
| " York Mills\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M3L\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/North_York\" title=\"North York\">\n", | |
| " North York\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Downsview\" title=\"Downsview\">\n", | |
| " Downsview West\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M4L\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/East_Toronto\" title=\"East Toronto\">\n", | |
| " East Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " The Beaches West\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M4L\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/East_Toronto\" title=\"East Toronto\">\n", | |
| " East Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a class=\"mw-redirect\" href=\"/wiki/India_Bazaar\" title=\"India Bazaar\">\n", | |
| " India Bazaar\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M5L\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Downtown_Toronto\" title=\"Downtown Toronto\">\n", | |
| " Downtown Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Commerce_Court\" title=\"Commerce Court\">\n", | |
| " Commerce Court\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M5L\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Downtown_Toronto\" title=\"Downtown Toronto\">\n", | |
| " Downtown Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Victoria Hotel\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M6L\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/North_York\" title=\"North York\">\n", | |
| " North York\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a class=\"mw-redirect\" href=\"/wiki/Downsview,_Toronto\" title=\"Downsview, Toronto\">\n", | |
| " Downsview\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M6L\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/North_York\" title=\"North York\">\n", | |
| " North York\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " North Park\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M6L\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/North_York\" title=\"North York\">\n", | |
| " North York\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Upwood Park\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M7L\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M8L\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M9L\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/North_York\" title=\"North York\">\n", | |
| " North York\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Humber_Summit\" title=\"Humber Summit\">\n", | |
| " Humber Summit\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M1M\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Scarborough,_Toronto\" title=\"Scarborough, Toronto\">\n", | |
| " Scarborough\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Cliffcrest\" title=\"Cliffcrest\">\n", | |
| " Cliffcrest\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M1M\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Scarborough,_Toronto\" title=\"Scarborough, Toronto\">\n", | |
| " Scarborough\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Cliffside,_Toronto\" title=\"Cliffside, Toronto\">\n", | |
| " Cliffside\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M1M\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Scarborough,_Toronto\" title=\"Scarborough, Toronto\">\n", | |
| " Scarborough\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Scarborough Village West\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M2M\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/North_York\" title=\"North York\">\n", | |
| " North York\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Newtonbrook\" title=\"Newtonbrook\">\n", | |
| " Newtonbrook\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M2M\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/North_York\" title=\"North York\">\n", | |
| " North York\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Willowdale,_Toronto\" title=\"Willowdale, Toronto\">\n", | |
| " Willowdale\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M3M\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/North_York\" title=\"North York\">\n", | |
| " North York\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Downsview Central\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M4M\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/East_Toronto\" title=\"East Toronto\">\n", | |
| " East Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Studio District\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M5M\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/North_York\" title=\"North York\">\n", | |
| " North York\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Bedford_Park,_Toronto\" title=\"Bedford Park, Toronto\">\n", | |
| " Bedford Park\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M5M\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/North_York\" title=\"North York\">\n", | |
| " North York\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Lawrence Manor East\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M6M\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/York\" title=\"York\">\n", | |
| " York\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Del Ray\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M6M\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/York\" title=\"York\">\n", | |
| " York\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a class=\"mw-redirect\" href=\"/wiki/Keelesdale\" title=\"Keelesdale\">\n", | |
| " Keelesdale\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M6M\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/York\" title=\"York\">\n", | |
| " York\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Mount_Dennis\" title=\"Mount Dennis\">\n", | |
| " Mount Dennis\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M6M\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/York\" title=\"York\">\n", | |
| " York\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Silverthorn,_Toronto\" title=\"Silverthorn, Toronto\">\n", | |
| " Silverthorn\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M7M\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M8M\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M9M\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/North_York\" title=\"North York\">\n", | |
| " North York\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a class=\"mw-redirect\" href=\"/wiki/Emery,_Toronto\" title=\"Emery, Toronto\">\n", | |
| " Emery\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M9M\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/North_York\" title=\"North York\">\n", | |
| " North York\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a class=\"mw-redirect\" href=\"/wiki/Humberlea\" title=\"Humberlea\">\n", | |
| " Humberlea\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M1N\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Scarborough,_Toronto\" title=\"Scarborough, Toronto\">\n", | |
| " Scarborough\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Birch_Cliff\" title=\"Birch Cliff\">\n", | |
| " Birch Cliff\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M1N\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Scarborough,_Toronto\" title=\"Scarborough, Toronto\">\n", | |
| " Scarborough\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Cliffside West\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M2N\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/North_York\" title=\"North York\">\n", | |
| " North York\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Willowdale South\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M3N\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/North_York\" title=\"North York\">\n", | |
| " North York\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Downsview Northwest\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M4N\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a class=\"mw-redirect\" href=\"/wiki/Central_Toronto\" title=\"Central Toronto\">\n", | |
| " Central Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Lawrence_Park,_Toronto\" title=\"Lawrence Park, Toronto\">\n", | |
| " Lawrence Park\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M5N\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a class=\"mw-redirect\" href=\"/wiki/Central_Toronto\" title=\"Central Toronto\">\n", | |
| " Central Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Roselawn\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M6N\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/York\" title=\"York\">\n", | |
| " York\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " The Junction North\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M6N\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/York\" title=\"York\">\n", | |
| " York\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Runnymede\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M7N\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M8N\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M9N\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/York\" title=\"York\">\n", | |
| " York\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Weston,_Toronto\" title=\"Weston, Toronto\">\n", | |
| " Weston\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M1P\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Scarborough,_Toronto\" title=\"Scarborough, Toronto\">\n", | |
| " Scarborough\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Dorset_Park\" title=\"Dorset Park\">\n", | |
| " Dorset Park\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M1P\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Scarborough,_Toronto\" title=\"Scarborough, Toronto\">\n", | |
| " Scarborough\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Scarborough_Town_Centre\" title=\"Scarborough Town Centre\">\n", | |
| " Scarborough Town Centre\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M1P\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Scarborough,_Toronto\" title=\"Scarborough, Toronto\">\n", | |
| " Scarborough\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a class=\"mw-redirect\" href=\"/wiki/Wexford_Heights\" title=\"Wexford Heights\">\n", | |
| " Wexford Heights\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M2P\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/North_York\" title=\"North York\">\n", | |
| " North York\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " York Mills West\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M3P\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M4P\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a class=\"mw-redirect\" href=\"/wiki/Central_Toronto\" title=\"Central Toronto\">\n", | |
| " Central Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Davisville North\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M5P\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a class=\"mw-redirect\" href=\"/wiki/Central_Toronto\" title=\"Central Toronto\">\n", | |
| " Central Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a class=\"mw-redirect\" href=\"/wiki/Forest_Hill_North\" title=\"Forest Hill North\">\n", | |
| " Forest Hill North\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M5P\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a class=\"mw-redirect\" href=\"/wiki/Central_Toronto\" title=\"Central Toronto\">\n", | |
| " Central Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Forest Hill West\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M6P\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/West_Toronto\" title=\"West Toronto\">\n", | |
| " West Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/High_Park\" title=\"High Park\">\n", | |
| " High Park\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M6P\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/West_Toronto\" title=\"West Toronto\">\n", | |
| " West Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " The Junction South\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M7P\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M8P\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M9P\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Etobicoke\" title=\"Etobicoke\">\n", | |
| " Etobicoke\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Westmount\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M1R\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Scarborough,_Toronto\" title=\"Scarborough, Toronto\">\n", | |
| " Scarborough\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Maryvale,_Toronto\" title=\"Maryvale, Toronto\">\n", | |
| " Maryvale\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M1R\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Scarborough,_Toronto\" title=\"Scarborough, Toronto\">\n", | |
| " Scarborough\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Wexford,_Toronto\" title=\"Wexford, Toronto\">\n", | |
| " Wexford\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M2R\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/North_York\" title=\"North York\">\n", | |
| " North York\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a class=\"mw-redirect\" href=\"/wiki/Willowdale_West\" title=\"Willowdale West\">\n", | |
| " Willowdale West\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M3R\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M4R\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a class=\"mw-redirect\" href=\"/wiki/Central_Toronto\" title=\"Central Toronto\">\n", | |
| " Central Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " North Toronto West\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M5R\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a class=\"mw-redirect\" href=\"/wiki/Central_Toronto\" title=\"Central Toronto\">\n", | |
| " Central Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/The_Annex\" title=\"The Annex\">\n", | |
| " The Annex\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M5R\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a class=\"mw-redirect\" href=\"/wiki/Central_Toronto\" title=\"Central Toronto\">\n", | |
| " Central Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " North Midtown\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M5R\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a class=\"mw-redirect\" href=\"/wiki/Central_Toronto\" title=\"Central Toronto\">\n", | |
| " Central Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Yorkville,_Toronto\" title=\"Yorkville, Toronto\">\n", | |
| " Yorkville\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M6R\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/West_Toronto\" title=\"West Toronto\">\n", | |
| " West Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Parkdale,_Toronto\" title=\"Parkdale, Toronto\">\n", | |
| " Parkdale\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M6R\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/West_Toronto\" title=\"West Toronto\">\n", | |
| " West Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Roncesvalles,_Toronto\" title=\"Roncesvalles, Toronto\">\n", | |
| " Roncesvalles\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M7R\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Mississauga\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Canada Post Gateway Processing Centre\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M8R\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M9R\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Etobicoke\" title=\"Etobicoke\">\n", | |
| " Etobicoke\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Kingsview_Village\" title=\"Kingsview Village\">\n", | |
| " Kingsview Village\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M9R\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Etobicoke\" title=\"Etobicoke\">\n", | |
| " Etobicoke\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Martin Grove Gardens\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M9R\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Etobicoke\" title=\"Etobicoke\">\n", | |
| " Etobicoke\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Richview Gardens\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M9R\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Etobicoke\" title=\"Etobicoke\">\n", | |
| " Etobicoke\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " St. Phillips\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M1S\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Scarborough,_Toronto\" title=\"Scarborough, Toronto\">\n", | |
| " Scarborough\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Agincourt,_Toronto\" title=\"Agincourt, Toronto\">\n", | |
| " Agincourt\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M2S\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M3S\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M4S\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a class=\"mw-redirect\" href=\"/wiki/Central_Toronto\" title=\"Central Toronto\">\n", | |
| " Central Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Davisville\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M5S\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Downtown_Toronto\" title=\"Downtown Toronto\">\n", | |
| " Downtown Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Harbord\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M5S\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Downtown_Toronto\" title=\"Downtown Toronto\">\n", | |
| " Downtown Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/University_of_Toronto\" title=\"University of Toronto\">\n", | |
| " University of Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M6S\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/West_Toronto\" title=\"West Toronto\">\n", | |
| " West Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Runnymede,_Toronto\" title=\"Runnymede, Toronto\">\n", | |
| " Runnymede\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M6S\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/West_Toronto\" title=\"West Toronto\">\n", | |
| " West Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Swansea,_Toronto\" title=\"Swansea, Toronto\">\n", | |
| " Swansea\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M7S\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M8S\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M9S\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M1T\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Scarborough,_Toronto\" title=\"Scarborough, Toronto\">\n", | |
| " Scarborough\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Clarks Corners\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M1T\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Scarborough,_Toronto\" title=\"Scarborough, Toronto\">\n", | |
| " Scarborough\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Sullivan\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M1T\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Scarborough,_Toronto\" title=\"Scarborough, Toronto\">\n", | |
| " Scarborough\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Tam_O%27Shanter_%E2%80%93_Sullivan\" title=\"Tam O'Shanter – Sullivan\">\n", | |
| " Tam O'Shanter\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M2T\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M3T\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M4T\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a class=\"mw-redirect\" href=\"/wiki/Central_Toronto\" title=\"Central Toronto\">\n", | |
| " Central Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Moore_Park,_Toronto\" title=\"Moore Park, Toronto\">\n", | |
| " Moore Park\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M4T\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a class=\"mw-redirect\" href=\"/wiki/Central_Toronto\" title=\"Central Toronto\">\n", | |
| " Central Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Summerhill East\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M5T\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Downtown_Toronto\" title=\"Downtown Toronto\">\n", | |
| " Downtown Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Chinatown,_Toronto\" title=\"Chinatown, Toronto\">\n", | |
| " Chinatown\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M5T\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Downtown_Toronto\" title=\"Downtown Toronto\">\n", | |
| " Downtown Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Grange_Park_(Toronto)\" title=\"Grange Park (Toronto)\">\n", | |
| " Grange Park\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M5T\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Downtown_Toronto\" title=\"Downtown Toronto\">\n", | |
| " Downtown Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Kensington_Market\" title=\"Kensington Market\">\n", | |
| " Kensington Market\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M6T\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M7T\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M8T\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M9T\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M1V\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Scarborough,_Toronto\" title=\"Scarborough, Toronto\">\n", | |
| " Scarborough\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a class=\"mw-redirect\" href=\"/wiki/Agincourt_North\" title=\"Agincourt North\">\n", | |
| " Agincourt North\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M1V\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Scarborough,_Toronto\" title=\"Scarborough, Toronto\">\n", | |
| " Scarborough\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " L'Amoreaux East\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M1V\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Scarborough,_Toronto\" title=\"Scarborough, Toronto\">\n", | |
| " Scarborough\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Milliken,_Ontario\" title=\"Milliken, Ontario\">\n", | |
| " Milliken\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M1V\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Scarborough,_Toronto\" title=\"Scarborough, Toronto\">\n", | |
| " Scarborough\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Steeles East\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M2V\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M3V\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M4V\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a class=\"mw-redirect\" href=\"/wiki/Central_Toronto\" title=\"Central Toronto\">\n", | |
| " Central Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Deer_Park,_Toronto\" title=\"Deer Park, Toronto\">\n", | |
| " Deer Park\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M4V\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a class=\"mw-redirect\" href=\"/wiki/Central_Toronto\" title=\"Central Toronto\">\n", | |
| " Central Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Forest Hill SE\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M4V\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a class=\"mw-redirect\" href=\"/wiki/Central_Toronto\" title=\"Central Toronto\">\n", | |
| " Central Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a class=\"mw-redirect\" href=\"/wiki/Rathnelly\" title=\"Rathnelly\">\n", | |
| " Rathnelly\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M4V\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a class=\"mw-redirect\" href=\"/wiki/Central_Toronto\" title=\"Central Toronto\">\n", | |
| " Central Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/South_Hill,_Toronto\" title=\"South Hill, Toronto\">\n", | |
| " South Hill\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M4V\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a class=\"mw-redirect\" href=\"/wiki/Central_Toronto\" title=\"Central Toronto\">\n", | |
| " Central Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Summerhill West\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M5V\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Downtown_Toronto\" title=\"Downtown Toronto\">\n", | |
| " Downtown Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/CN_Tower\" title=\"CN Tower\">\n", | |
| " CN Tower\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M5V\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Downtown_Toronto\" title=\"Downtown Toronto\">\n", | |
| " Downtown Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Bathurst Quay\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M5V\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Downtown_Toronto\" title=\"Downtown Toronto\">\n", | |
| " Downtown Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Island airport\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M5V\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Downtown_Toronto\" title=\"Downtown Toronto\">\n", | |
| " Downtown Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Harbourfront West\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M5V\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Downtown_Toronto\" title=\"Downtown Toronto\">\n", | |
| " Downtown Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a class=\"mw-redirect\" href=\"/wiki/King_and_Spadina\" title=\"King and Spadina\">\n", | |
| " King and Spadina\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M5V\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Downtown_Toronto\" title=\"Downtown Toronto\">\n", | |
| " Downtown Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Railway_Lands\" title=\"Railway Lands\">\n", | |
| " Railway Lands\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M5V\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Downtown_Toronto\" title=\"Downtown Toronto\">\n", | |
| " Downtown Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a class=\"mw-redirect\" href=\"/wiki/South_Niagara\" title=\"South Niagara\">\n", | |
| " South Niagara\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M6V\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M7V\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M8V\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Etobicoke\" title=\"Etobicoke\">\n", | |
| " Etobicoke\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Humber Bay Shores\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M8V\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Etobicoke\" title=\"Etobicoke\">\n", | |
| " Etobicoke\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Mimico South\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M8V\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Etobicoke\" title=\"Etobicoke\">\n", | |
| " Etobicoke\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/New_Toronto\" title=\"New Toronto\">\n", | |
| " New Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M9V\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Etobicoke\" title=\"Etobicoke\">\n", | |
| " Etobicoke\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Albion Gardens\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M9V\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Etobicoke\" title=\"Etobicoke\">\n", | |
| " Etobicoke\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a class=\"mw-redirect\" href=\"/wiki/Beaumond_Heights\" title=\"Beaumond Heights\">\n", | |
| " Beaumond Heights\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M9V\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Etobicoke\" title=\"Etobicoke\">\n", | |
| " Etobicoke\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Humbergate\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M9V\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Etobicoke\" title=\"Etobicoke\">\n", | |
| " Etobicoke\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a class=\"mw-redirect\" href=\"/wiki/Mount_Olive-Silverstone-Jamestown\" title=\"Mount Olive-Silverstone-Jamestown\">\n", | |
| " Jamestown\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M9V\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Etobicoke\" title=\"Etobicoke\">\n", | |
| " Etobicoke\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a class=\"mw-redirect\" href=\"/wiki/Mount_Olive-Silverstone-Jamestown\" title=\"Mount Olive-Silverstone-Jamestown\">\n", | |
| " Mount Olive\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M9V\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Etobicoke\" title=\"Etobicoke\">\n", | |
| " Etobicoke\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a class=\"mw-redirect\" href=\"/wiki/Silverstone,_Toronto\" title=\"Silverstone, Toronto\">\n", | |
| " Silverstone\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M9V\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Etobicoke\" title=\"Etobicoke\">\n", | |
| " Etobicoke\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a class=\"mw-redirect\" href=\"/wiki/South_Steeles\" title=\"South Steeles\">\n", | |
| " South Steeles\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M9V\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Etobicoke\" title=\"Etobicoke\">\n", | |
| " Etobicoke\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Thistletown\" title=\"Thistletown\">\n", | |
| " Thistletown\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M1W\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Scarborough,_Toronto\" title=\"Scarborough, Toronto\">\n", | |
| " Scarborough\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " L'Amoreaux West\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M2W\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M3W\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M4W\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Downtown_Toronto\" title=\"Downtown Toronto\">\n", | |
| " Downtown Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Rosedale,_Toronto\" title=\"Rosedale, Toronto\">\n", | |
| " Rosedale\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M5W\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Downtown_Toronto\" title=\"Downtown Toronto\">\n", | |
| " Downtown Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Stn A PO Boxes 25 The Esplanade\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M6W\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M7W\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M8W\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Etobicoke\" title=\"Etobicoke\">\n", | |
| " Etobicoke\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Alderwood,_Toronto\" title=\"Alderwood, Toronto\">\n", | |
| " Alderwood\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M8W\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Etobicoke\" title=\"Etobicoke\">\n", | |
| " Etobicoke\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Long_Branch,_Toronto\" title=\"Long Branch, Toronto\">\n", | |
| " Long Branch\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M9W\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Etobicoke\" title=\"Etobicoke\">\n", | |
| " Etobicoke\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Northwest\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M1X\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Scarborough,_Toronto\" title=\"Scarborough, Toronto\">\n", | |
| " Scarborough\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a class=\"mw-redirect\" href=\"/wiki/Upper_Rouge\" title=\"Upper Rouge\">\n", | |
| " Upper Rouge\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M2X\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M3X\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M4X\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Downtown_Toronto\" title=\"Downtown Toronto\">\n", | |
| " Downtown Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Cabbagetown,_Toronto\" title=\"Cabbagetown, Toronto\">\n", | |
| " Cabbagetown\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M4X\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Downtown_Toronto\" title=\"Downtown Toronto\">\n", | |
| " Downtown Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/St._James_Town\" title=\"St. James Town\">\n", | |
| " St. James Town\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M5X\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Downtown_Toronto\" title=\"Downtown Toronto\">\n", | |
| " Downtown Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/First_Canadian_Place\" title=\"First Canadian Place\">\n", | |
| " First Canadian Place\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M5X\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Downtown_Toronto\" title=\"Downtown Toronto\">\n", | |
| " Downtown Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Underground_city\" title=\"Underground city\">\n", | |
| " Underground city\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M6X\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M7X\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M8X\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Etobicoke\" title=\"Etobicoke\">\n", | |
| " Etobicoke\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/The_Kingsway\" title=\"The Kingsway\">\n", | |
| " The Kingsway\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M8X\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Etobicoke\" title=\"Etobicoke\">\n", | |
| " Etobicoke\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Montgomery Road\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M8X\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Etobicoke\" title=\"Etobicoke\">\n", | |
| " Etobicoke\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Old Mill North\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M9X\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M1Y\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M2Y\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M3Y\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M4Y\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Downtown_Toronto\" title=\"Downtown Toronto\">\n", | |
| " Downtown Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Church_and_Wellesley\" title=\"Church and Wellesley\">\n", | |
| " Church and Wellesley\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M5Y\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M6Y\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M7Y\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/East_Toronto\" title=\"East Toronto\">\n", | |
| " East Toronto\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Business Reply Mail Processing Centre 969 Eastern\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M8Y\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Etobicoke\" title=\"Etobicoke\">\n", | |
| " Etobicoke\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Humber_Bay\" title=\"Humber Bay\">\n", | |
| " Humber Bay\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M8Y\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Etobicoke\" title=\"Etobicoke\">\n", | |
| " Etobicoke\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " King's Mill Park\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M8Y\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Etobicoke\" title=\"Etobicoke\">\n", | |
| " Etobicoke\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Kingsway Park South East\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M8Y\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Etobicoke\" title=\"Etobicoke\">\n", | |
| " Etobicoke\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Mimico\" title=\"Mimico\">\n", | |
| " Mimico NE\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M8Y\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Etobicoke\" title=\"Etobicoke\">\n", | |
| " Etobicoke\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Old_Mill,_Toronto\" title=\"Old Mill, Toronto\">\n", | |
| " Old Mill South\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M8Y\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Etobicoke\" title=\"Etobicoke\">\n", | |
| " Etobicoke\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/The_Queensway\" title=\"The Queensway\">\n", | |
| " The Queensway East\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M8Y\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Etobicoke\" title=\"Etobicoke\">\n", | |
| " Etobicoke\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a class=\"mw-redirect\" href=\"/wiki/Fairmont_Royal_York_Hotel\" title=\"Fairmont Royal York Hotel\">\n", | |
| " Royal York South East\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M8Y\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Etobicoke\" title=\"Etobicoke\">\n", | |
| " Etobicoke\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a class=\"mw-redirect\" href=\"/wiki/Sunnylea\" title=\"Sunnylea\">\n", | |
| " Sunnylea\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M9Y\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M1Z\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M2Z\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M3Z\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M4Z\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M5Z\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M6Z\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M7Z\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M8Z\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Etobicoke\" title=\"Etobicoke\">\n", | |
| " Etobicoke\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Kingsway Park South West\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M8Z\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Etobicoke\" title=\"Etobicoke\">\n", | |
| " Etobicoke\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Mimico\" title=\"Mimico\">\n", | |
| " Mimico NW\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M8Z\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Etobicoke\" title=\"Etobicoke\">\n", | |
| " Etobicoke\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/The_Queensway\" title=\"The Queensway\">\n", | |
| " The Queensway West\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M8Z\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Etobicoke\" title=\"Etobicoke\">\n", | |
| " Etobicoke\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Royal York South West\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M8Z\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <a href=\"/wiki/Etobicoke\" title=\"Etobicoke\">\n", | |
| " Etobicoke\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " South of Bloor\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " M9Z\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " Not assigned\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| " </table>\n", | |
| " <div>\n", | |
| " <table class=\"multicol\" role=\"presentation\" style=\"border-collapse: collapse; padding: 0; border: 0; background:transparent; width:100%;\">\n", | |
| " </table>\n", | |
| " <h2>\n", | |
| " <span id=\"Most_populated_FSAs.5B3.5D\">\n", | |
| " </span>\n", | |
| " <span class=\"mw-headline\" id=\"Most_populated_FSAs[3]\">\n", | |
| " Most populated FSAs\n", | |
| " <sup class=\"reference\" id=\"cite_ref-statcan_3-0\">\n", | |
| " <a href=\"#cite_note-statcan-3\">\n", | |
| " [3]\n", | |
| " </a>\n", | |
| " </sup>\n", | |
| " </span>\n", | |
| " <span class=\"mw-editsection\">\n", | |
| " <span class=\"mw-editsection-bracket\">\n", | |
| " [\n", | |
| " </span>\n", | |
| " <a href=\"/w/index.php?title=List_of_postal_codes_of_Canada:_M&action=edit&section=2\" title=\"Edit section: Most populated FSAs[3]\">\n", | |
| " edit\n", | |
| " </a>\n", | |
| " <span class=\"mw-editsection-bracket\">\n", | |
| " ]\n", | |
| " </span>\n", | |
| " </span>\n", | |
| " </h2>\n", | |
| " <ol>\n", | |
| " <li>\n", | |
| " M1B, 65,129\n", | |
| " </li>\n", | |
| " <li>\n", | |
| " M2N, 60,124\n", | |
| " </li>\n", | |
| " <li>\n", | |
| " M1V, 55,250\n", | |
| " </li>\n", | |
| " <li>\n", | |
| " M9V, 55,159\n", | |
| " </li>\n", | |
| " <li>\n", | |
| " M2J, 54,391\n", | |
| " </li>\n", | |
| " </ol>\n", | |
| " <p>\n", | |
| " </p>\n", | |
| " <table cellpadding=\"2\" cellspacing=\"0\" rules=\"all\" style=\"width:100%; border-collapse:collapse; border:1px solid #ccc;\">\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| " </table>\n", | |
| " </div>\n", | |
| " <p>\n", | |
| " </p>\n", | |
| " <h2>\n", | |
| " <span id=\"Least_populated_FSAs.5B3.5D\">\n", | |
| " </span>\n", | |
| " <span class=\"mw-headline\" id=\"Least_populated_FSAs[3]\">\n", | |
| " Least populated FSAs\n", | |
| " <sup class=\"reference\" id=\"cite_ref-statcan_3-1\">\n", | |
| " <a href=\"#cite_note-statcan-3\">\n", | |
| " [3]\n", | |
| " </a>\n", | |
| " </sup>\n", | |
| " </span>\n", | |
| " <span class=\"mw-editsection\">\n", | |
| " <span class=\"mw-editsection-bracket\">\n", | |
| " [\n", | |
| " </span>\n", | |
| " <a href=\"/w/index.php?title=List_of_postal_codes_of_Canada:_M&action=edit&section=3\" title=\"Edit section: Least populated FSAs[3]\">\n", | |
| " edit\n", | |
| " </a>\n", | |
| " <span class=\"mw-editsection-bracket\">\n", | |
| " ]\n", | |
| " </span>\n", | |
| " </span>\n", | |
| " </h2>\n", | |
| " <ol>\n", | |
| " <li>\n", | |
| " M5K, 5\n", | |
| " </li>\n", | |
| " <li>\n", | |
| " M5L, 5\n", | |
| " </li>\n", | |
| " <li>\n", | |
| " M5W, 5\n", | |
| " </li>\n", | |
| " <li>\n", | |
| " M5X, 5\n", | |
| " </li>\n", | |
| " <li>\n", | |
| " M7A, 5\n", | |
| " </li>\n", | |
| " </ol>\n", | |
| " <p>\n", | |
| " </p>\n", | |
| " <h2>\n", | |
| " <span class=\"mw-headline\" id=\"References\">\n", | |
| " References\n", | |
| " </span>\n", | |
| " <span class=\"mw-editsection\">\n", | |
| " <span class=\"mw-editsection-bracket\">\n", | |
| " [\n", | |
| " </span>\n", | |
| " <a href=\"/w/index.php?title=List_of_postal_codes_of_Canada:_M&action=edit&section=4\" title=\"Edit section: References\">\n", | |
| " edit\n", | |
| " </a>\n", | |
| " <span class=\"mw-editsection-bracket\">\n", | |
| " ]\n", | |
| " </span>\n", | |
| " </span>\n", | |
| " </h2>\n", | |
| " <div class=\"mw-references-wrap\">\n", | |
| " <ol class=\"references\">\n", | |
| " <li id=\"cite_note-1\">\n", | |
| " <span class=\"mw-cite-backlink\">\n", | |
| " <b>\n", | |
| " <a href=\"#cite_ref-1\">\n", | |
| " ^\n", | |
| " </a>\n", | |
| " </b>\n", | |
| " </span>\n", | |
| " <span class=\"reference-text\">\n", | |
| " <cite class=\"citation web\">\n", | |
| " Canada Post.\n", | |
| " <a class=\"external text\" href=\"https://www.canadapost.ca/cpotools/apps/fpc/personal/findByCity?execution=e2s1\" rel=\"nofollow\">\n", | |
| " \"Canada Post - Find a Postal Code\"\n", | |
| " </a>\n", | |
| " <span class=\"reference-accessdate\">\n", | |
| " . Retrieved\n", | |
| " <span class=\"nowrap\">\n", | |
| " 9 November\n", | |
| " </span>\n", | |
| " 2008\n", | |
| " </span>\n", | |
| " .\n", | |
| " </cite>\n", | |
| " <span class=\"Z3988\" title=\"ctx_ver=Z39.88-2004&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&rft.genre=unknown&rft.btitle=Canada+Post+-+Find+a+Postal+Code&rft.au=Canada+Post&rft_id=https%3A%2F%2Fwww.canadapost.ca%2Fcpotools%2Fapps%2Ffpc%2Fpersonal%2FfindByCity%3Fexecution%3De2s1&rfr_id=info%3Asid%2Fen.wikipedia.org%3AList+of+postal+codes+of+Canada%3A+M\">\n", | |
| " </span>\n", | |
| " <style data-mw-deduplicate=\"TemplateStyles:r886058088\">\n", | |
| " .mw-parser-output cite.citation{font-style:inherit}.mw-parser-output .citation q{quotes:\"\\\"\"\"\\\"\"\"'\"\"'\"}.mw-parser-output .citation .cs1-lock-free a{background:url(\"//upload.wikimedia.org/wikipedia/commons/thumb/6/65/Lock-green.svg/9px-Lock-green.svg.png\")no-repeat;background-position:right .1em center}.mw-parser-output .citation .cs1-lock-limited a,.mw-parser-output .citation .cs1-lock-registration a{background:url(\"//upload.wikimedia.org/wikipedia/commons/thumb/d/d6/Lock-gray-alt-2.svg/9px-Lock-gray-alt-2.svg.png\")no-repeat;background-position:right .1em center}.mw-parser-output .citation .cs1-lock-subscription a{background:url(\"//upload.wikimedia.org/wikipedia/commons/thumb/a/aa/Lock-red-alt-2.svg/9px-Lock-red-alt-2.svg.png\")no-repeat;background-position:right .1em center}.mw-parser-output .cs1-subscription,.mw-parser-output .cs1-registration{color:#555}.mw-parser-output .cs1-subscription span,.mw-parser-output .cs1-registration span{border-bottom:1px dotted;cursor:help}.mw-parser-output .cs1-ws-icon a{background:url(\"//upload.wikimedia.org/wikipedia/commons/thumb/4/4c/Wikisource-logo.svg/12px-Wikisource-logo.svg.png\")no-repeat;background-position:right .1em center}.mw-parser-output code.cs1-code{color:inherit;background:inherit;border:inherit;padding:inherit}.mw-parser-output .cs1-hidden-error{display:none;font-size:100%}.mw-parser-output .cs1-visible-error{font-size:100%}.mw-parser-output .cs1-maint{display:none;color:#33aa33;margin-left:0.3em}.mw-parser-output .cs1-subscription,.mw-parser-output .cs1-registration,.mw-parser-output .cs1-format{font-size:95%}.mw-parser-output .cs1-kern-left,.mw-parser-output .cs1-kern-wl-left{padding-left:0.2em}.mw-parser-output .cs1-kern-right,.mw-parser-output .cs1-kern-wl-right{padding-right:0.2em}\n", | |
| " </style>\n", | |
| " </span>\n", | |
| " </li>\n", | |
| " <li id=\"cite_note-2\">\n", | |
| " <span class=\"mw-cite-backlink\">\n", | |
| " <b>\n", | |
| " <a href=\"#cite_ref-2\">\n", | |
| " ^\n", | |
| " </a>\n", | |
| " </b>\n", | |
| " </span>\n", | |
| " <span class=\"reference-text\">\n", | |
| " <cite class=\"citation web\">\n", | |
| " <a class=\"external text\" href=\"https://web.archive.org/web/20110519093024/http://www.canadapost.ca/cpo/mc/personal/tools/mobileapp/default.jsf\" rel=\"nofollow\">\n", | |
| " \"Mobile Apps\"\n", | |
| " </a>\n", | |
| " . Canada Post. Archived from\n", | |
| " <a class=\"external text\" href=\"http://www.canadapost.ca/cpo/mc/personal/tools/mobileapp/default.jsf\" rel=\"nofollow\">\n", | |
| " the original\n", | |
| " </a>\n", | |
| " on 2011-05-19.\n", | |
| " </cite>\n", | |
| " <span class=\"Z3988\" title=\"ctx_ver=Z39.88-2004&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&rft.genre=unknown&rft.btitle=Mobile+Apps&rft.pub=Canada+Post&rft_id=http%3A%2F%2Fwww.canadapost.ca%2Fcpo%2Fmc%2Fpersonal%2Ftools%2Fmobileapp%2Fdefault.jsf&rfr_id=info%3Asid%2Fen.wikipedia.org%3AList+of+postal+codes+of+Canada%3A+M\">\n", | |
| " </span>\n", | |
| " <link href=\"mw-data:TemplateStyles:r886058088\" rel=\"mw-deduplicated-inline-style\"/>\n", | |
| " </span>\n", | |
| " </li>\n", | |
| " <li id=\"cite_note-statcan-3\">\n", | |
| " <span class=\"mw-cite-backlink\">\n", | |
| " ^\n", | |
| " <a href=\"#cite_ref-statcan_3-0\">\n", | |
| " <sup>\n", | |
| " <i>\n", | |
| " <b>\n", | |
| " a\n", | |
| " </b>\n", | |
| " </i>\n", | |
| " </sup>\n", | |
| " </a>\n", | |
| " <a href=\"#cite_ref-statcan_3-1\">\n", | |
| " <sup>\n", | |
| " <i>\n", | |
| " <b>\n", | |
| " b\n", | |
| " </b>\n", | |
| " </i>\n", | |
| " </sup>\n", | |
| " </a>\n", | |
| " </span>\n", | |
| " <span class=\"reference-text\">\n", | |
| " <cite class=\"citation web\">\n", | |
| " <a class=\"external text\" href=\"http://www12.statcan.ca/english/census06/data/popdwell/Table.cfm?T=1201&SR=1&S=0&O=A&RPP=9999&PR=0&CMA=0\" rel=\"nofollow\">\n", | |
| " \"2006 Census of Population\"\n", | |
| " </a>\n", | |
| " . 15 October 2008.\n", | |
| " </cite>\n", | |
| " <span class=\"Z3988\" title=\"ctx_ver=Z39.88-2004&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&rft.genre=unknown&rft.btitle=2006+Census+of+Population&rft.date=2008-10-15&rft_id=http%3A%2F%2Fwww12.statcan.ca%2Fenglish%2Fcensus06%2Fdata%2Fpopdwell%2FTable.cfm%3FT%3D1201%26SR%3D1%26S%3D0%26O%3DA%26RPP%3D9999%26PR%3D0%26CMA%3D0&rfr_id=info%3Asid%2Fen.wikipedia.org%3AList+of+postal+codes+of+Canada%3A+M\">\n", | |
| " </span>\n", | |
| " <link href=\"mw-data:TemplateStyles:r886058088\" rel=\"mw-deduplicated-inline-style\"/>\n", | |
| " </span>\n", | |
| " </li>\n", | |
| " </ol>\n", | |
| " </div>\n", | |
| " <table class=\"navbox\">\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <td style=\"width:36px; text-align:center\">\n", | |
| " <a class=\"image\" href=\"/wiki/File:Flag_of_Canada.svg\" title=\"Flag of Canada\">\n", | |
| " <img alt=\"Flag of Canada\" data-file-height=\"600\" data-file-width=\"1200\" decoding=\"async\" height=\"18\" src=\"//upload.wikimedia.org/wikipedia/en/thumb/c/cf/Flag_of_Canada.svg/36px-Flag_of_Canada.svg.png\" srcset=\"//upload.wikimedia.org/wikipedia/en/thumb/c/cf/Flag_of_Canada.svg/54px-Flag_of_Canada.svg.png 1.5x, //upload.wikimedia.org/wikipedia/en/thumb/c/cf/Flag_of_Canada.svg/72px-Flag_of_Canada.svg.png 2x\" width=\"36\"/>\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <th class=\"navbox-title\" style=\"font-size:110%\">\n", | |
| " <a href=\"/wiki/Postal_codes_in_Canada\" title=\"Postal codes in Canada\">\n", | |
| " Canadian postal codes\n", | |
| " </a>\n", | |
| " </th>\n", | |
| " <td style=\"width:36px; text-align:center\">\n", | |
| " <a class=\"image\" href=\"/wiki/File:Canadian_postal_district_map_(without_legends).svg\">\n", | |
| " <img alt=\"Canadian postal district map (without legends).svg\" data-file-height=\"846\" data-file-width=\"1000\" decoding=\"async\" height=\"18\" src=\"//upload.wikimedia.org/wikipedia/commons/thumb/e/eb/Canadian_postal_district_map_%28without_legends%29.svg/21px-Canadian_postal_district_map_%28without_legends%29.svg.png\" srcset=\"//upload.wikimedia.org/wikipedia/commons/thumb/e/eb/Canadian_postal_district_map_%28without_legends%29.svg/32px-Canadian_postal_district_map_%28without_legends%29.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/e/eb/Canadian_postal_district_map_%28without_legends%29.svg/43px-Canadian_postal_district_map_%28without_legends%29.svg.png 2x\" width=\"21\"/>\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td colspan=\"3\" style=\"text-align:center; font-size: 100%;\">\n", | |
| " <table cellspacing=\"0\" style=\"background-color: #F8F8F8;\" width=\"100%\">\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <td style=\"text-align:center; border:1px solid #aaa;\">\n", | |
| " <a href=\"/wiki/Newfoundland_and_Labrador\" title=\"Newfoundland and Labrador\">\n", | |
| " NL\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td style=\"text-align:center; border:1px solid #aaa;\">\n", | |
| " <a href=\"/wiki/Nova_Scotia\" title=\"Nova Scotia\">\n", | |
| " NS\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td style=\"text-align:center; border:1px solid #aaa;\">\n", | |
| " <a href=\"/wiki/Prince_Edward_Island\" title=\"Prince Edward Island\">\n", | |
| " PE\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td style=\"text-align:center; border:1px solid #aaa;\">\n", | |
| " <a href=\"/wiki/New_Brunswick\" title=\"New Brunswick\">\n", | |
| " NB\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td colspan=\"3\" style=\"text-align:center; border:1px solid #aaa;\">\n", | |
| " <a href=\"/wiki/Quebec\" title=\"Quebec\">\n", | |
| " QC\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td colspan=\"5\" style=\"text-align:center; border:1px solid #aaa;\">\n", | |
| " <a href=\"/wiki/Ontario\" title=\"Ontario\">\n", | |
| " ON\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td style=\"text-align:center; border:1px solid #aaa;\">\n", | |
| " <a href=\"/wiki/Manitoba\" title=\"Manitoba\">\n", | |
| " MB\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td style=\"text-align:center; border:1px solid #aaa;\">\n", | |
| " <a href=\"/wiki/Saskatchewan\" title=\"Saskatchewan\">\n", | |
| " SK\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td style=\"text-align:center; border:1px solid #aaa;\">\n", | |
| " <a href=\"/wiki/Alberta\" title=\"Alberta\">\n", | |
| " AB\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td style=\"text-align:center; border:1px solid #aaa;\">\n", | |
| " <a href=\"/wiki/British_Columbia\" title=\"British Columbia\">\n", | |
| " BC\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td style=\"text-align:center; border:1px solid #aaa;\">\n", | |
| " <a href=\"/wiki/Nunavut\" title=\"Nunavut\">\n", | |
| " NU\n", | |
| " </a>\n", | |
| " /\n", | |
| " <a href=\"/wiki/Northwest_Territories\" title=\"Northwest Territories\">\n", | |
| " NT\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td style=\"text-align:center; border:1px solid #aaa;\">\n", | |
| " <a href=\"/wiki/Yukon\" title=\"Yukon\">\n", | |
| " YT\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <td align=\"center\" style=\"border: 1px solid #FF0000; background-color: #FFE0E0; font-size: 135%;\" width=\"5%\">\n", | |
| " <a href=\"/wiki/List_of_postal_codes_of_Canada:_A\" title=\"List of postal codes of Canada: A\">\n", | |
| " A\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td align=\"center\" style=\"border: 1px solid #FF4000; background-color: #FFE8E0; font-size: 135%;\" width=\"5%\">\n", | |
| " <a href=\"/wiki/List_of_postal_codes_of_Canada:_B\" title=\"List of postal codes of Canada: B\">\n", | |
| " B\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td align=\"center\" style=\"border: 1px solid #FF8000; background-color: #FFF0E0; font-size: 135%;\" width=\"5%\">\n", | |
| " <a href=\"/wiki/List_of_postal_codes_of_Canada:_C\" title=\"List of postal codes of Canada: C\">\n", | |
| " C\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td align=\"center\" style=\"border: 1px solid #FFC000; background-color: #FFF8E0; font-size: 135%;\" width=\"5%\">\n", | |
| " <a href=\"/wiki/List_of_postal_codes_of_Canada:_E\" title=\"List of postal codes of Canada: E\">\n", | |
| " E\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td align=\"center\" style=\"border: 1px solid #FFFF00; background-color: #FFFFE0; font-size: 135%;\" width=\"5%\">\n", | |
| " <a href=\"/wiki/List_of_postal_codes_of_Canada:_G\" title=\"List of postal codes of Canada: G\">\n", | |
| " G\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td align=\"center\" style=\"border: 1px solid #C0FF00; background-color: #F8FFE0; font-size: 135%;\" width=\"5%\">\n", | |
| " <a href=\"/wiki/List_of_postal_codes_of_Canada:_H\" title=\"List of postal codes of Canada: H\">\n", | |
| " H\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td align=\"center\" style=\"border: 1px solid #80FF00; background-color: #F0FFE0; font-size: 135%;\" width=\"5%\">\n", | |
| " <a href=\"/wiki/List_of_postal_codes_of_Canada:_J\" title=\"List of postal codes of Canada: J\">\n", | |
| " J\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td align=\"center\" style=\"border: 1px solid #00FF00; background-color: #E0FFE0; font-size: 135%;\" width=\"5%\">\n", | |
| " <a href=\"/wiki/List_of_postal_codes_of_Canada:_K\" title=\"List of postal codes of Canada: K\">\n", | |
| " K\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td align=\"center\" style=\"border: 1px solid #00FF80; background-color: #E0FFF0; font-size: 135%;\" width=\"5%\">\n", | |
| " <a href=\"/wiki/List_of_postal_codes_of_Canada:_L\" title=\"List of postal codes of Canada: L\">\n", | |
| " L\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td align=\"center\" style=\"border: 1px solid #E0FFF8; background-color: #00FFC0; font-size: 135%; color: black;\" width=\"5%\">\n", | |
| " <a class=\"mw-selflink selflink\">\n", | |
| " M\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td align=\"center\" style=\"border: 1px solid #00FFE0; background-color: #E0FFFC; font-size: 135%;\" width=\"5%\">\n", | |
| " <a href=\"/wiki/List_of_postal_codes_of_Canada:_N\" title=\"List of postal codes of Canada: N\">\n", | |
| " N\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td align=\"center\" style=\"border: 1px solid #00FFFF; background-color: #E0FFFF; font-size: 135%;\" width=\"5%\">\n", | |
| " <a href=\"/wiki/List_of_postal_codes_of_Canada:_P\" title=\"List of postal codes of Canada: P\">\n", | |
| " P\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td align=\"center\" style=\"border: 1px solid #00C0FF; background-color: #E0F8FF; font-size: 135%;\" width=\"5%\">\n", | |
| " <a href=\"/wiki/List_of_postal_codes_of_Canada:_R\" title=\"List of postal codes of Canada: R\">\n", | |
| " R\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td align=\"center\" style=\"border: 1px solid #0080FF; background-color: #E0F0FF; font-size: 135%;\" width=\"5%\">\n", | |
| " <a href=\"/wiki/List_of_postal_codes_of_Canada:_S\" title=\"List of postal codes of Canada: S\">\n", | |
| " S\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td align=\"center\" style=\"border: 1px solid #0040FF; background-color: #E0E8FF; font-size: 135%;\" width=\"5%\">\n", | |
| " <a href=\"/wiki/List_of_postal_codes_of_Canada:_T\" title=\"List of postal codes of Canada: T\">\n", | |
| " T\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td align=\"center\" style=\"border: 1px solid #0000FF; background-color: #E0E0FF; font-size: 135%;\" width=\"5%\">\n", | |
| " <a href=\"/wiki/List_of_postal_codes_of_Canada:_V\" title=\"List of postal codes of Canada: V\">\n", | |
| " V\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td align=\"center\" style=\"border: 1px solid #A000FF; background-color: #E8E0FF; font-size: 135%;\" width=\"5%\">\n", | |
| " <a href=\"/wiki/List_of_postal_codes_of_Canada:_X\" title=\"List of postal codes of Canada: X\">\n", | |
| " X\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " <td align=\"center\" style=\"border: 1px solid #FF00FF; background-color: #FFE0FF; font-size: 135%;\" width=\"5%\">\n", | |
| " <a href=\"/wiki/List_of_postal_codes_of_Canada:_Y\" title=\"List of postal codes of Canada: Y\">\n", | |
| " Y\n", | |
| " </a>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| " </table>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| " </table>\n", | |
| " <!-- \n", | |
| "NewPP limit report\n", | |
| "Parsed by mw1248\n", | |
| "Cached time: 20190523145800\n", | |
| "Cache expiry: 2592000\n", | |
| "Dynamic content: false\n", | |
| "CPU time usage: 0.420 seconds\n", | |
| "Real time usage: 0.462 seconds\n", | |
| "Preprocessor visited node count: 575/1000000\n", | |
| "Preprocessor generated node count: 0/1500000\n", | |
| "Post‐expand include size: 10232/2097152 bytes\n", | |
| "Template argument size: 13/2097152 bytes\n", | |
| "Highest expansion depth: 4/40\n", | |
| "Expensive parser function count: 0/500\n", | |
| "Unstrip recursion depth: 1/20\n", | |
| "Unstrip post‐expand size: 9025/5000000 bytes\n", | |
| "Number of Wikibase entities loaded: 0/400\n", | |
| "Lua time usage: 0.121/10.000 seconds\n", | |
| "Lua memory usage: 1.71 MB/50 MB\n", | |
| "-->\n", | |
| " <!--\n", | |
| "Transclusion expansion time report (%,ms,calls,template)\n", | |
| "100.00% 195.927 1 -total\n", | |
| " 84.01% 164.589 3 Template:Cite_web\n", | |
| " 3.60% 7.045 1 Template:Canadian_postal_codes\n", | |
| " 3.06% 5.997 1 Template:Col-2\n", | |
| " 1.58% 3.102 1 Template:Col-begin\n", | |
| " 1.48% 2.902 2 Template:Col-end\n", | |
| " 1.46% 2.860 1 Template:Col-break\n", | |
| "-->\n", | |
| " <!-- Saved in parser cache with key enwiki:pcache:idhash:539066-0!canonical and timestamp 20190523145759 and revision id 890001695\n", | |
| " -->\n", | |
| " </div>\n", | |
| " <noscript>\n", | |
| " <img alt=\"\" height=\"1\" src=\"//en.wikipedia.org/wiki/Special:CentralAutoLogin/start?type=1x1\" style=\"border: none; position: absolute;\" title=\"\" width=\"1\"/>\n", | |
| " </noscript>\n", | |
| " </div>\n", | |
| " <div class=\"printfooter\">\n", | |
| " Retrieved from \"\n", | |
| " <a dir=\"ltr\" href=\"https://en.wikipedia.org/w/index.php?title=List_of_postal_codes_of_Canada:_M&oldid=890001695\">\n", | |
| " https://en.wikipedia.org/w/index.php?title=List_of_postal_codes_of_Canada:_M&oldid=890001695\n", | |
| " </a>\n", | |
| " \"\n", | |
| " </div>\n", | |
| " <div class=\"catlinks\" data-mw=\"interface\" id=\"catlinks\">\n", | |
| " <div class=\"mw-normal-catlinks\" id=\"mw-normal-catlinks\">\n", | |
| " <a href=\"/wiki/Help:Category\" title=\"Help:Category\">\n", | |
| " Categories\n", | |
| " </a>\n", | |
| " :\n", | |
| " <ul>\n", | |
| " <li>\n", | |
| " <a href=\"/wiki/Category:Communications_in_Ontario\" title=\"Category:Communications in Ontario\">\n", | |
| " Communications in Ontario\n", | |
| " </a>\n", | |
| " </li>\n", | |
| " <li>\n", | |
| " <a href=\"/wiki/Category:Postal_codes_in_Canada\" title=\"Category:Postal codes in Canada\">\n", | |
| " Postal codes in Canada\n", | |
| " </a>\n", | |
| " </li>\n", | |
| " <li>\n", | |
| " <a href=\"/wiki/Category:Toronto\" title=\"Category:Toronto\">\n", | |
| " Toronto\n", | |
| " </a>\n", | |
| " </li>\n", | |
| " <li>\n", | |
| " <a href=\"/wiki/Category:Ontario-related_lists\" title=\"Category:Ontario-related lists\">\n", | |
| " Ontario-related lists\n", | |
| " </a>\n", | |
| " </li>\n", | |
| " </ul>\n", | |
| " </div>\n", | |
| " </div>\n", | |
| " <div class=\"visualClear\">\n", | |
| " </div>\n", | |
| " </div>\n", | |
| " </div>\n", | |
| " <div id=\"mw-navigation\">\n", | |
| " <h2>\n", | |
| " Navigation menu\n", | |
| " </h2>\n", | |
| " <div id=\"mw-head\">\n", | |
| " <div aria-labelledby=\"p-personal-label\" id=\"p-personal\" role=\"navigation\">\n", | |
| " <h3 id=\"p-personal-label\">\n", | |
| " Personal tools\n", | |
| " </h3>\n", | |
| " <ul>\n", | |
| " <li id=\"pt-anonuserpage\">\n", | |
| " Not logged in\n", | |
| " </li>\n", | |
| " <li id=\"pt-anontalk\">\n", | |
| " <a accesskey=\"n\" href=\"/wiki/Special:MyTalk\" title=\"Discussion about edits from this IP address [n]\">\n", | |
| " Talk\n", | |
| " </a>\n", | |
| " </li>\n", | |
| " <li id=\"pt-anoncontribs\">\n", | |
| " <a accesskey=\"y\" href=\"/wiki/Special:MyContributions\" title=\"A list of edits made from this IP address [y]\">\n", | |
| " Contributions\n", | |
| " </a>\n", | |
| " </li>\n", | |
| " <li id=\"pt-createaccount\">\n", | |
| " <a href=\"/w/index.php?title=Special:CreateAccount&returnto=List+of+postal+codes+of+Canada%3A+M\" title=\"You are encouraged to create an account and log in; however, it is not mandatory\">\n", | |
| " Create account\n", | |
| " </a>\n", | |
| " </li>\n", | |
| " <li id=\"pt-login\">\n", | |
| " <a accesskey=\"o\" href=\"/w/index.php?title=Special:UserLogin&returnto=List+of+postal+codes+of+Canada%3A+M\" title=\"You're encouraged to log in; however, it's not mandatory. [o]\">\n", | |
| " Log in\n", | |
| " </a>\n", | |
| " </li>\n", | |
| " </ul>\n", | |
| " </div>\n", | |
| " <div id=\"left-navigation\">\n", | |
| " <div aria-labelledby=\"p-namespaces-label\" class=\"vectorTabs\" id=\"p-namespaces\" role=\"navigation\">\n", | |
| " <h3 id=\"p-namespaces-label\">\n", | |
| " Namespaces\n", | |
| " </h3>\n", | |
| " <ul>\n", | |
| " <li class=\"selected\" id=\"ca-nstab-main\">\n", | |
| " <span>\n", | |
| " <a accesskey=\"c\" href=\"/wiki/List_of_postal_codes_of_Canada:_M\" title=\"View the content page [c]\">\n", | |
| " Article\n", | |
| " </a>\n", | |
| " </span>\n", | |
| " </li>\n", | |
| " <li id=\"ca-talk\">\n", | |
| " <span>\n", | |
| " <a accesskey=\"t\" href=\"/wiki/Talk:List_of_postal_codes_of_Canada:_M\" rel=\"discussion\" title=\"Discussion about the content page [t]\">\n", | |
| " Talk\n", | |
| " </a>\n", | |
| " </span>\n", | |
| " </li>\n", | |
| " </ul>\n", | |
| " </div>\n", | |
| " <div aria-labelledby=\"p-variants-label\" class=\"vectorMenu emptyPortlet\" id=\"p-variants\" role=\"navigation\">\n", | |
| " <input aria-labelledby=\"p-variants-label\" class=\"vectorMenuCheckbox\" type=\"checkbox\"/>\n", | |
| " <h3 id=\"p-variants-label\">\n", | |
| " <span>\n", | |
| " Variants\n", | |
| " </span>\n", | |
| " </h3>\n", | |
| " <ul class=\"menu\">\n", | |
| " </ul>\n", | |
| " </div>\n", | |
| " </div>\n", | |
| " <div id=\"right-navigation\">\n", | |
| " <div aria-labelledby=\"p-views-label\" class=\"vectorTabs\" id=\"p-views\" role=\"navigation\">\n", | |
| " <h3 id=\"p-views-label\">\n", | |
| " Views\n", | |
| " </h3>\n", | |
| " <ul>\n", | |
| " <li class=\"collapsible selected\" id=\"ca-view\">\n", | |
| " <span>\n", | |
| " <a href=\"/wiki/List_of_postal_codes_of_Canada:_M\">\n", | |
| " Read\n", | |
| " </a>\n", | |
| " </span>\n", | |
| " </li>\n", | |
| " <li class=\"collapsible\" id=\"ca-edit\">\n", | |
| " <span>\n", | |
| " <a accesskey=\"e\" href=\"/w/index.php?title=List_of_postal_codes_of_Canada:_M&action=edit\" title=\"Edit this page [e]\">\n", | |
| " Edit\n", | |
| " </a>\n", | |
| " </span>\n", | |
| " </li>\n", | |
| " <li class=\"collapsible\" id=\"ca-history\">\n", | |
| " <span>\n", | |
| " <a accesskey=\"h\" href=\"/w/index.php?title=List_of_postal_codes_of_Canada:_M&action=history\" title=\"Past revisions of this page [h]\">\n", | |
| " View history\n", | |
| " </a>\n", | |
| " </span>\n", | |
| " </li>\n", | |
| " </ul>\n", | |
| " </div>\n", | |
| " <div aria-labelledby=\"p-cactions-label\" class=\"vectorMenu emptyPortlet\" id=\"p-cactions\" role=\"navigation\">\n", | |
| " <input aria-labelledby=\"p-cactions-label\" class=\"vectorMenuCheckbox\" type=\"checkbox\"/>\n", | |
| " <h3 id=\"p-cactions-label\">\n", | |
| " <span>\n", | |
| " More\n", | |
| " </span>\n", | |
| " </h3>\n", | |
| " <ul class=\"menu\">\n", | |
| " </ul>\n", | |
| " </div>\n", | |
| " <div id=\"p-search\" role=\"search\">\n", | |
| " <h3>\n", | |
| " <label for=\"searchInput\">\n", | |
| " Search\n", | |
| " </label>\n", | |
| " </h3>\n", | |
| " <form action=\"/w/index.php\" id=\"searchform\">\n", | |
| " <div id=\"simpleSearch\">\n", | |
| " <input accesskey=\"f\" id=\"searchInput\" name=\"search\" placeholder=\"Search Wikipedia\" title=\"Search Wikipedia [f]\" type=\"search\"/>\n", | |
| " <input name=\"title\" type=\"hidden\" value=\"Special:Search\"/>\n", | |
| " <input class=\"searchButton mw-fallbackSearchButton\" id=\"mw-searchButton\" name=\"fulltext\" title=\"Search Wikipedia for this text\" type=\"submit\" value=\"Search\"/>\n", | |
| " <input class=\"searchButton\" id=\"searchButton\" name=\"go\" title=\"Go to a page with this exact name if it exists\" type=\"submit\" value=\"Go\"/>\n", | |
| " </div>\n", | |
| " </form>\n", | |
| " </div>\n", | |
| " </div>\n", | |
| " </div>\n", | |
| " <div id=\"mw-panel\">\n", | |
| " <div id=\"p-logo\" role=\"banner\">\n", | |
| " <a class=\"mw-wiki-logo\" href=\"/wiki/Main_Page\" title=\"Visit the main page\">\n", | |
| " </a>\n", | |
| " </div>\n", | |
| " <div aria-labelledby=\"p-navigation-label\" class=\"portal\" id=\"p-navigation\" role=\"navigation\">\n", | |
| " <h3 id=\"p-navigation-label\">\n", | |
| " Navigation\n", | |
| " </h3>\n", | |
| " <div class=\"body\">\n", | |
| " <ul>\n", | |
| " <li id=\"n-mainpage-description\">\n", | |
| " <a accesskey=\"z\" href=\"/wiki/Main_Page\" title=\"Visit the main page [z]\">\n", | |
| " Main page\n", | |
| " </a>\n", | |
| " </li>\n", | |
| " <li id=\"n-contents\">\n", | |
| " <a href=\"/wiki/Portal:Contents\" title=\"Guides to browsing Wikipedia\">\n", | |
| " Contents\n", | |
| " </a>\n", | |
| " </li>\n", | |
| " <li id=\"n-featuredcontent\">\n", | |
| " <a href=\"/wiki/Portal:Featured_content\" title=\"Featured content – the best of Wikipedia\">\n", | |
| " Featured content\n", | |
| " </a>\n", | |
| " </li>\n", | |
| " <li id=\"n-currentevents\">\n", | |
| " <a href=\"/wiki/Portal:Current_events\" title=\"Find background information on current events\">\n", | |
| " Current events\n", | |
| " </a>\n", | |
| " </li>\n", | |
| " <li id=\"n-randompage\">\n", | |
| " <a accesskey=\"x\" href=\"/wiki/Special:Random\" title=\"Load a random article [x]\">\n", | |
| " Random article\n", | |
| " </a>\n", | |
| " </li>\n", | |
| " <li id=\"n-sitesupport\">\n", | |
| " <a href=\"https://donate.wikimedia.org/wiki/Special:FundraiserRedirector?utm_source=donate&utm_medium=sidebar&utm_campaign=C13_en.wikipedia.org&uselang=en\" title=\"Support us\">\n", | |
| " Donate to Wikipedia\n", | |
| " </a>\n", | |
| " </li>\n", | |
| " <li id=\"n-shoplink\">\n", | |
| " <a href=\"//shop.wikimedia.org\" title=\"Visit the Wikipedia store\">\n", | |
| " Wikipedia store\n", | |
| " </a>\n", | |
| " </li>\n", | |
| " </ul>\n", | |
| " </div>\n", | |
| " </div>\n", | |
| " <div aria-labelledby=\"p-interaction-label\" class=\"portal\" id=\"p-interaction\" role=\"navigation\">\n", | |
| " <h3 id=\"p-interaction-label\">\n", | |
| " Interaction\n", | |
| " </h3>\n", | |
| " <div class=\"body\">\n", | |
| " <ul>\n", | |
| " <li id=\"n-help\">\n", | |
| " <a href=\"/wiki/Help:Contents\" title=\"Guidance on how to use and edit Wikipedia\">\n", | |
| " Help\n", | |
| " </a>\n", | |
| " </li>\n", | |
| " <li id=\"n-aboutsite\">\n", | |
| " <a href=\"/wiki/Wikipedia:About\" title=\"Find out about Wikipedia\">\n", | |
| " About Wikipedia\n", | |
| " </a>\n", | |
| " </li>\n", | |
| " <li id=\"n-portal\">\n", | |
| " <a href=\"/wiki/Wikipedia:Community_portal\" title=\"About the project, what you can do, where to find things\">\n", | |
| " Community portal\n", | |
| " </a>\n", | |
| " </li>\n", | |
| " <li id=\"n-recentchanges\">\n", | |
| " <a accesskey=\"r\" href=\"/wiki/Special:RecentChanges\" title=\"A list of recent changes in the wiki [r]\">\n", | |
| " Recent changes\n", | |
| " </a>\n", | |
| " </li>\n", | |
| " <li id=\"n-contactpage\">\n", | |
| " <a href=\"//en.wikipedia.org/wiki/Wikipedia:Contact_us\" title=\"How to contact Wikipedia\">\n", | |
| " Contact page\n", | |
| " </a>\n", | |
| " </li>\n", | |
| " </ul>\n", | |
| " </div>\n", | |
| " </div>\n", | |
| " <div aria-labelledby=\"p-tb-label\" class=\"portal\" id=\"p-tb\" role=\"navigation\">\n", | |
| " <h3 id=\"p-tb-label\">\n", | |
| " Tools\n", | |
| " </h3>\n", | |
| " <div class=\"body\">\n", | |
| " <ul>\n", | |
| " <li id=\"t-whatlinkshere\">\n", | |
| " <a accesskey=\"j\" href=\"/wiki/Special:WhatLinksHere/List_of_postal_codes_of_Canada:_M\" title=\"List of all English Wikipedia pages containing links to this page [j]\">\n", | |
| " What links here\n", | |
| " </a>\n", | |
| " </li>\n", | |
| " <li id=\"t-recentchangeslinked\">\n", | |
| " <a accesskey=\"k\" href=\"/wiki/Special:RecentChangesLinked/List_of_postal_codes_of_Canada:_M\" rel=\"nofollow\" title=\"Recent changes in pages linked from this page [k]\">\n", | |
| " Related changes\n", | |
| " </a>\n", | |
| " </li>\n", | |
| " <li id=\"t-upload\">\n", | |
| " <a accesskey=\"u\" href=\"/wiki/Wikipedia:File_Upload_Wizard\" title=\"Upload files [u]\">\n", | |
| " Upload file\n", | |
| " </a>\n", | |
| " </li>\n", | |
| " <li id=\"t-specialpages\">\n", | |
| " <a accesskey=\"q\" href=\"/wiki/Special:SpecialPages\" title=\"A list of all special pages [q]\">\n", | |
| " Special pages\n", | |
| " </a>\n", | |
| " </li>\n", | |
| " <li id=\"t-permalink\">\n", | |
| " <a href=\"/w/index.php?title=List_of_postal_codes_of_Canada:_M&oldid=890001695\" title=\"Permanent link to this revision of the page\">\n", | |
| " Permanent link\n", | |
| " </a>\n", | |
| " </li>\n", | |
| " <li id=\"t-info\">\n", | |
| " <a href=\"/w/index.php?title=List_of_postal_codes_of_Canada:_M&action=info\" title=\"More information about this page\">\n", | |
| " Page information\n", | |
| " </a>\n", | |
| " </li>\n", | |
| " <li id=\"t-wikibase\">\n", | |
| " <a accesskey=\"g\" href=\"https://www.wikidata.org/wiki/Special:EntityPage/Q3248240\" title=\"Link to connected data repository item [g]\">\n", | |
| " Wikidata item\n", | |
| " </a>\n", | |
| " </li>\n", | |
| " <li id=\"t-cite\">\n", | |
| " <a href=\"/w/index.php?title=Special:CiteThisPage&page=List_of_postal_codes_of_Canada%3A_M&id=890001695\" title=\"Information on how to cite this page\">\n", | |
| " Cite this page\n", | |
| " </a>\n", | |
| " </li>\n", | |
| " </ul>\n", | |
| " </div>\n", | |
| " </div>\n", | |
| " <div aria-labelledby=\"p-coll-print_export-label\" class=\"portal\" id=\"p-coll-print_export\" role=\"navigation\">\n", | |
| " <h3 id=\"p-coll-print_export-label\">\n", | |
| " Print/export\n", | |
| " </h3>\n", | |
| " <div class=\"body\">\n", | |
| " <ul>\n", | |
| " <li id=\"coll-create_a_book\">\n", | |
| " <a href=\"/w/index.php?title=Special:Book&bookcmd=book_creator&referer=List+of+postal+codes+of+Canada%3A+M\">\n", | |
| " Create a book\n", | |
| " </a>\n", | |
| " </li>\n", | |
| " <li id=\"coll-download-as-rl\">\n", | |
| " <a href=\"/w/index.php?title=Special:ElectronPdf&page=List+of+postal+codes+of+Canada%3A+M&action=show-download-screen\">\n", | |
| " Download as PDF\n", | |
| " </a>\n", | |
| " </li>\n", | |
| " <li id=\"t-print\">\n", | |
| " <a accesskey=\"p\" href=\"/w/index.php?title=List_of_postal_codes_of_Canada:_M&printable=yes\" title=\"Printable version of this page [p]\">\n", | |
| " Printable version\n", | |
| " </a>\n", | |
| " </li>\n", | |
| " </ul>\n", | |
| " </div>\n", | |
| " </div>\n", | |
| " <div aria-labelledby=\"p-lang-label\" class=\"portal\" id=\"p-lang\" role=\"navigation\">\n", | |
| " <h3 id=\"p-lang-label\">\n", | |
| " Languages\n", | |
| " </h3>\n", | |
| " <div class=\"body\">\n", | |
| " <ul>\n", | |
| " <li class=\"interlanguage-link interwiki-fr\">\n", | |
| " <a class=\"interlanguage-link-target\" href=\"https://fr.wikipedia.org/wiki/Liste_des_codes_postaux_canadiens_d%C3%A9butant_par_M\" hreflang=\"fr\" lang=\"fr\" title=\"Liste des codes postaux canadiens débutant par M – French\">\n", | |
| " Français\n", | |
| " </a>\n", | |
| " </li>\n", | |
| " </ul>\n", | |
| " <div class=\"after-portlet after-portlet-lang\">\n", | |
| " <span class=\"wb-langlinks-edit wb-langlinks-link\">\n", | |
| " <a class=\"wbc-editpage\" href=\"https://www.wikidata.org/wiki/Special:EntityPage/Q3248240#sitelinks-wikipedia\" title=\"Edit interlanguage links\">\n", | |
| " Edit links\n", | |
| " </a>\n", | |
| " </span>\n", | |
| " </div>\n", | |
| " </div>\n", | |
| " </div>\n", | |
| " </div>\n", | |
| " </div>\n", | |
| " <div id=\"footer\" role=\"contentinfo\">\n", | |
| " <ul id=\"footer-info\">\n", | |
| " <li id=\"footer-info-lastmod\">\n", | |
| " This page was last edited on 29 March 2019, at 11:01\n", | |
| " <span class=\"anonymous-show\">\n", | |
| " (UTC)\n", | |
| " </span>\n", | |
| " .\n", | |
| " </li>\n", | |
| " <li id=\"footer-info-copyright\">\n", | |
| " Text is available under the\n", | |
| " <a href=\"//en.wikipedia.org/wiki/Wikipedia:Text_of_Creative_Commons_Attribution-ShareAlike_3.0_Unported_License\" rel=\"license\">\n", | |
| " Creative Commons Attribution-ShareAlike License\n", | |
| " </a>\n", | |
| " <a href=\"//creativecommons.org/licenses/by-sa/3.0/\" rel=\"license\" style=\"display:none;\">\n", | |
| " </a>\n", | |
| " ;\n", | |
| "additional terms may apply. By using this site, you agree to the\n", | |
| " <a href=\"//foundation.wikimedia.org/wiki/Terms_of_Use\">\n", | |
| " Terms of Use\n", | |
| " </a>\n", | |
| " and\n", | |
| " <a href=\"//foundation.wikimedia.org/wiki/Privacy_policy\">\n", | |
| " Privacy Policy\n", | |
| " </a>\n", | |
| " . Wikipedia® is a registered trademark of the\n", | |
| " <a href=\"//www.wikimediafoundation.org/\">\n", | |
| " Wikimedia Foundation, Inc.\n", | |
| " </a>\n", | |
| " , a non-profit organization.\n", | |
| " </li>\n", | |
| " </ul>\n", | |
| " <ul id=\"footer-places\">\n", | |
| " <li id=\"footer-places-privacy\">\n", | |
| " <a class=\"extiw\" href=\"https://foundation.wikimedia.org/wiki/Privacy_policy\" title=\"wmf:Privacy policy\">\n", | |
| " Privacy policy\n", | |
| " </a>\n", | |
| " </li>\n", | |
| " <li id=\"footer-places-about\">\n", | |
| " <a href=\"/wiki/Wikipedia:About\" title=\"Wikipedia:About\">\n", | |
| " About Wikipedia\n", | |
| " </a>\n", | |
| " </li>\n", | |
| " <li id=\"footer-places-disclaimer\">\n", | |
| " <a href=\"/wiki/Wikipedia:General_disclaimer\" title=\"Wikipedia:General disclaimer\">\n", | |
| " Disclaimers\n", | |
| " </a>\n", | |
| " </li>\n", | |
| " <li id=\"footer-places-contact\">\n", | |
| " <a href=\"//en.wikipedia.org/wiki/Wikipedia:Contact_us\">\n", | |
| " Contact Wikipedia\n", | |
| " </a>\n", | |
| " </li>\n", | |
| " <li id=\"footer-places-developers\">\n", | |
| " <a href=\"https://www.mediawiki.org/wiki/Special:MyLanguage/How_to_contribute\">\n", | |
| " Developers\n", | |
| " </a>\n", | |
| " </li>\n", | |
| " <li id=\"footer-places-cookiestatement\">\n", | |
| " <a href=\"https://foundation.wikimedia.org/wiki/Cookie_statement\">\n", | |
| " Cookie statement\n", | |
| " </a>\n", | |
| " </li>\n", | |
| " <li id=\"footer-places-mobileview\">\n", | |
| " <a class=\"noprint stopMobileRedirectToggle\" href=\"//en.m.wikipedia.org/w/index.php?title=List_of_postal_codes_of_Canada:_M&mobileaction=toggle_view_mobile\">\n", | |
| " Mobile view\n", | |
| " </a>\n", | |
| " </li>\n", | |
| " </ul>\n", | |
| " <ul class=\"noprint\" id=\"footer-icons\">\n", | |
| " <li id=\"footer-copyrightico\">\n", | |
| " <a href=\"https://wikimediafoundation.org/\">\n", | |
| " <img alt=\"Wikimedia Foundation\" height=\"31\" src=\"/static/images/wikimedia-button.png\" srcset=\"/static/images/wikimedia-button-1.5x.png 1.5x, /static/images/wikimedia-button-2x.png 2x\" width=\"88\"/>\n", | |
| " </a>\n", | |
| " </li>\n", | |
| " <li id=\"footer-poweredbyico\">\n", | |
| " <a href=\"https://www.mediawiki.org/\">\n", | |
| " <img alt=\"Powered by MediaWiki\" height=\"31\" src=\"/static/images/poweredby_mediawiki_88x31.png\" srcset=\"/static/images/poweredby_mediawiki_132x47.png 1.5x, /static/images/poweredby_mediawiki_176x62.png 2x\" width=\"88\"/>\n", | |
| " </a>\n", | |
| " </li>\n", | |
| " </ul>\n", | |
| " <div style=\"clear: both;\">\n", | |
| " </div>\n", | |
| " </div>\n", | |
| " <script>\n", | |
| " (RLQ=window.RLQ||[]).push(function(){mw.config.set({\"wgPageParseReport\":{\"limitreport\":{\"cputime\":\"0.420\",\"walltime\":\"0.462\",\"ppvisitednodes\":{\"value\":575,\"limit\":1000000},\"ppgeneratednodes\":{\"value\":0,\"limit\":1500000},\"postexpandincludesize\":{\"value\":10232,\"limit\":2097152},\"templateargumentsize\":{\"value\":13,\"limit\":2097152},\"expansiondepth\":{\"value\":4,\"limit\":40},\"expensivefunctioncount\":{\"value\":0,\"limit\":500},\"unstrip-depth\":{\"value\":1,\"limit\":20},\"unstrip-size\":{\"value\":9025,\"limit\":5000000},\"entityaccesscount\":{\"value\":0,\"limit\":400},\"timingprofile\":[\"100.00% 195.927 1 -total\",\" 84.01% 164.589 3 Template:Cite_web\",\" 3.60% 7.045 1 Template:Canadian_postal_codes\",\" 3.06% 5.997 1 Template:Col-2\",\" 1.58% 3.102 1 Template:Col-begin\",\" 1.48% 2.902 2 Template:Col-end\",\" 1.46% 2.860 1 Template:Col-break\"]},\"scribunto\":{\"limitreport-timeusage\":{\"value\":\"0.121\",\"limit\":\"10.000\"},\"limitreport-memusage\":{\"value\":1788769,\"limit\":52428800}},\"cachereport\":{\"origin\":\"mw1248\",\"timestamp\":\"20190523145800\",\"ttl\":2592000,\"transientcontent\":false}}});});\n", | |
| " </script>\n", | |
| " <script type=\"application/ld+json\">\n", | |
| " {\"@context\":\"https:\\/\\/schema.org\",\"@type\":\"Article\",\"name\":\"List of postal codes of Canada: M\",\"url\":\"https:\\/\\/en.wikipedia.org\\/wiki\\/List_of_postal_codes_of_Canada:_M\",\"sameAs\":\"http:\\/\\/www.wikidata.org\\/entity\\/Q3248240\",\"mainEntity\":\"http:\\/\\/www.wikidata.org\\/entity\\/Q3248240\",\"author\":{\"@type\":\"Organization\",\"name\":\"Contributors to Wikimedia projects\"},\"publisher\":{\"@type\":\"Organization\",\"name\":\"Wikimedia Foundation, Inc.\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https:\\/\\/www.wikimedia.org\\/static\\/images\\/wmf-hor-googpub.png\"}},\"datePublished\":\"2004-03-20T10:02:13Z\",\"dateModified\":\"2019-03-29T11:01:52Z\",\"headline\":\"Wikimedia list article\"}\n", | |
| " </script>\n", | |
| " <script>\n", | |
| " (RLQ=window.RLQ||[]).push(function(){mw.config.set({\"wgBackendResponseTime\":100,\"wgHostname\":\"mw1268\"});});\n", | |
| " </script>\n", | |
| " </body>\n", | |
| "</html>\n", | |
| "\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "from bs4 import BeautifulSoup\n", | |
| "soup = BeautifulSoup(website_url,'lxml')\n", | |
| "print(soup.prettify())" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 6, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "# extract table\n", | |
| "My_table = soup.find('table',{'class':'wikitable sortable'})" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 5, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "\n", | |
| "Postcode\n", | |
| "Borough\n", | |
| "Neighbourhood\n", | |
| "\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "print(My_table.tr.text)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 7, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "headers=\"Postcode,Borough,Neighbourhood\"" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 8, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "M1A,Not assigned,Not assigned\n", | |
| "M2A,Not assigned,Not assigned\n", | |
| "M3A,North York,Parkwoods\n", | |
| "M4A,North York,Victoria Village\n", | |
| "M5A,Downtown Toronto,Harbourfront\n", | |
| "M5A,Downtown Toronto,Regent Park\n", | |
| "M6A,North York,Lawrence Heights\n", | |
| "M6A,North York,Lawrence Manor\n", | |
| "M7A,Queen's Park,Not assigned\n", | |
| "M8A,Not assigned,Not assigned\n", | |
| "M9A,Etobicoke,Islington Avenue\n", | |
| "M1B,Scarborough,Rouge\n", | |
| "M1B,Scarborough,Malvern\n", | |
| "M2B,Not assigned,Not assigned\n", | |
| "M3B,North York,Don Mills North\n", | |
| "M4B,East York,Woodbine Gardens\n", | |
| "M4B,East York,Parkview Hill\n", | |
| "M5B,Downtown Toronto,Ryerson\n", | |
| "M5B,Downtown Toronto,Garden District\n", | |
| "M6B,North York,Glencairn\n", | |
| "M7B,Not assigned,Not assigned\n", | |
| "M8B,Not assigned,Not assigned\n", | |
| "M9B,Etobicoke,Cloverdale\n", | |
| "M9B,Etobicoke,Islington\n", | |
| "M9B,Etobicoke,Martin Grove\n", | |
| "M9B,Etobicoke,Princess Gardens\n", | |
| "M9B,Etobicoke,West Deane Park\n", | |
| "M1C,Scarborough,Highland Creek\n", | |
| "M1C,Scarborough,Rouge Hill\n", | |
| "M1C,Scarborough,Port Union\n", | |
| "M2C,Not assigned,Not assigned\n", | |
| "M3C,North York,Flemingdon Park\n", | |
| "M3C,North York,Don Mills South\n", | |
| "M4C,East York,Woodbine Heights\n", | |
| "M5C,Downtown Toronto,St. James Town\n", | |
| "M6C,York,Humewood-Cedarvale\n", | |
| "M7C,Not assigned,Not assigned\n", | |
| "M8C,Not assigned,Not assigned\n", | |
| "M9C,Etobicoke,Bloordale Gardens\n", | |
| "M9C,Etobicoke,Eringate\n", | |
| "M9C,Etobicoke,Markland Wood\n", | |
| "M9C,Etobicoke,Old Burnhamthorpe\n", | |
| "M1E,Scarborough,Guildwood\n", | |
| "M1E,Scarborough,Morningside\n", | |
| "M1E,Scarborough,West Hill\n", | |
| "M2E,Not assigned,Not assigned\n", | |
| "M3E,Not assigned,Not assigned\n", | |
| "M4E,East Toronto,The Beaches\n", | |
| "M5E,Downtown Toronto,Berczy Park\n", | |
| "M6E,York,Caledonia-Fairbanks\n", | |
| "M7E,Not assigned,Not assigned\n", | |
| "M8E,Not assigned,Not assigned\n", | |
| "M9E,Not assigned,Not assigned\n", | |
| "M1G,Scarborough,Woburn\n", | |
| "M2G,Not assigned,Not assigned\n", | |
| "M3G,Not assigned,Not assigned\n", | |
| "M4G,East York,Leaside\n", | |
| "M5G,Downtown Toronto,Central Bay Street\n", | |
| "M6G,Downtown Toronto,Christie\n", | |
| "M7G,Not assigned,Not assigned\n", | |
| "M8G,Not assigned,Not assigned\n", | |
| "M9G,Not assigned,Not assigned\n", | |
| "M1H,Scarborough,Cedarbrae\n", | |
| "M2H,North York,Hillcrest Village\n", | |
| "M3H,North York,Bathurst Manor\n", | |
| "M3H,North York,Downsview North\n", | |
| "M3H,North York,Wilson Heights\n", | |
| "M4H,East York,Thorncliffe Park\n", | |
| "M5H,Downtown Toronto,Adelaide\n", | |
| "M5H,Downtown Toronto,King\n", | |
| "M5H,Downtown Toronto,Richmond\n", | |
| "M6H,West Toronto,Dovercourt Village\n", | |
| "M6H,West Toronto,Dufferin\n", | |
| "M7H,Not assigned,Not assigned\n", | |
| "M8H,Not assigned,Not assigned\n", | |
| "M9H,Not assigned,Not assigned\n", | |
| "M1J,Scarborough,Scarborough Village\n", | |
| "M2J,North York,Fairview\n", | |
| "M2J,North York,Henry Farm\n", | |
| "M2J,North York,Oriole\n", | |
| "M3J,North York,Northwood Park\n", | |
| "M3J,North York,York University\n", | |
| "M4J,East York,East Toronto\n", | |
| "M5J,Downtown Toronto,Harbourfront East\n", | |
| "M5J,Downtown Toronto,Toronto Islands\n", | |
| "M5J,Downtown Toronto,Union Station\n", | |
| "M6J,West Toronto,Little Portugal\n", | |
| "M6J,West Toronto,Trinity\n", | |
| "M7J,Not assigned,Not assigned\n", | |
| "M8J,Not assigned,Not assigned\n", | |
| "M9J,Not assigned,Not assigned\n", | |
| "M1K,Scarborough,East Birchmount Park\n", | |
| "M1K,Scarborough,Ionview\n", | |
| "M1K,Scarborough,Kennedy Park\n", | |
| "M2K,North York,Bayview Village\n", | |
| "M3K,North York,CFB Toronto\n", | |
| "M3K,North York,Downsview East\n", | |
| "M4K,East Toronto,The Danforth West\n", | |
| "M4K,East Toronto,Riverdale\n", | |
| "M5K,Downtown Toronto,Design Exchange\n", | |
| "M5K,Downtown Toronto,Toronto Dominion Centre\n", | |
| "M6K,West Toronto,Brockton\n", | |
| "M6K,West Toronto,Exhibition Place\n", | |
| "M6K,West Toronto,Parkdale Village\n", | |
| "M7K,Not assigned,Not assigned\n", | |
| "M8K,Not assigned,Not assigned\n", | |
| "M9K,Not assigned,Not assigned\n", | |
| "M1L,Scarborough,Clairlea\n", | |
| "M1L,Scarborough,Golden Mile\n", | |
| "M1L,Scarborough,Oakridge\n", | |
| "M2L,North York,Silver Hills\n", | |
| "M2L,North York,York Mills\n", | |
| "M3L,North York,Downsview West\n", | |
| "M4L,East Toronto,The Beaches West\n", | |
| "M4L,East Toronto,India Bazaar\n", | |
| "M5L,Downtown Toronto,Commerce Court\n", | |
| "M5L,Downtown Toronto,Victoria Hotel\n", | |
| "M6L,North York,Downsview\n", | |
| "M6L,North York,North Park\n", | |
| "M6L,North York,Upwood Park\n", | |
| "M7L,Not assigned,Not assigned\n", | |
| "M8L,Not assigned,Not assigned\n", | |
| "M9L,North York,Humber Summit\n", | |
| "M1M,Scarborough,Cliffcrest\n", | |
| "M1M,Scarborough,Cliffside\n", | |
| "M1M,Scarborough,Scarborough Village West\n", | |
| "M2M,North York,Newtonbrook\n", | |
| "M2M,North York,Willowdale\n", | |
| "M3M,North York,Downsview Central\n", | |
| "M4M,East Toronto,Studio District\n", | |
| "M5M,North York,Bedford Park\n", | |
| "M5M,North York,Lawrence Manor East\n", | |
| "M6M,York,Del Ray\n", | |
| "M6M,York,Keelesdale\n", | |
| "M6M,York,Mount Dennis\n", | |
| "M6M,York,Silverthorn\n", | |
| "M7M,Not assigned,Not assigned\n", | |
| "M8M,Not assigned,Not assigned\n", | |
| "M9M,North York,Emery\n", | |
| "M9M,North York,Humberlea\n", | |
| "M1N,Scarborough,Birch Cliff\n", | |
| "M1N,Scarborough,Cliffside West\n", | |
| "M2N,North York,Willowdale South\n", | |
| "M3N,North York,Downsview Northwest\n", | |
| "M4N,Central Toronto,Lawrence Park\n", | |
| "M5N,Central Toronto,Roselawn\n", | |
| "M6N,York,The Junction North\n", | |
| "M6N,York,Runnymede\n", | |
| "M7N,Not assigned,Not assigned\n", | |
| "M8N,Not assigned,Not assigned\n", | |
| "M9N,York,Weston\n", | |
| "M1P,Scarborough,Dorset Park\n", | |
| "M1P,Scarborough,Scarborough Town Centre\n", | |
| "M1P,Scarborough,Wexford Heights\n", | |
| "M2P,North York,York Mills West\n", | |
| "M3P,Not assigned,Not assigned\n", | |
| "M4P,Central Toronto,Davisville North\n", | |
| "M5P,Central Toronto,Forest Hill North\n", | |
| "M5P,Central Toronto,Forest Hill West\n", | |
| "M6P,West Toronto,High Park\n", | |
| "M6P,West Toronto,The Junction South\n", | |
| "M7P,Not assigned,Not assigned\n", | |
| "M8P,Not assigned,Not assigned\n", | |
| "M9P,Etobicoke,Westmount\n", | |
| "M1R,Scarborough,Maryvale\n", | |
| "M1R,Scarborough,Wexford\n", | |
| "M2R,North York,Willowdale West\n", | |
| "M3R,Not assigned,Not assigned\n", | |
| "M4R,Central Toronto,North Toronto West\n", | |
| "M5R,Central Toronto,The Annex\n", | |
| "M5R,Central Toronto,North Midtown\n", | |
| "M5R,Central Toronto,Yorkville\n", | |
| "M6R,West Toronto,Parkdale\n", | |
| "M6R,West Toronto,Roncesvalles\n", | |
| "M7R,Mississauga,Canada Post Gateway Processing Centre\n", | |
| "M8R,Not assigned,Not assigned\n", | |
| "M9R,Etobicoke,Kingsview Village\n", | |
| "M9R,Etobicoke,Martin Grove Gardens\n", | |
| "M9R,Etobicoke,Richview Gardens\n", | |
| "M9R,Etobicoke,St. Phillips\n", | |
| "M1S,Scarborough,Agincourt\n", | |
| "M2S,Not assigned,Not assigned\n", | |
| "M3S,Not assigned,Not assigned\n", | |
| "M4S,Central Toronto,Davisville\n", | |
| "M5S,Downtown Toronto,Harbord\n", | |
| "M5S,Downtown Toronto,University of Toronto\n", | |
| "M6S,West Toronto,Runnymede\n", | |
| "M6S,West Toronto,Swansea\n", | |
| "M7S,Not assigned,Not assigned\n", | |
| "M8S,Not assigned,Not assigned\n", | |
| "M9S,Not assigned,Not assigned\n", | |
| "M1T,Scarborough,Clarks Corners\n", | |
| "M1T,Scarborough,Sullivan\n", | |
| "M1T,Scarborough,Tam O'Shanter\n", | |
| "M2T,Not assigned,Not assigned\n", | |
| "M3T,Not assigned,Not assigned\n", | |
| "M4T,Central Toronto,Moore Park\n", | |
| "M4T,Central Toronto,Summerhill East\n", | |
| "M5T,Downtown Toronto,Chinatown\n", | |
| "M5T,Downtown Toronto,Grange Park\n", | |
| "M5T,Downtown Toronto,Kensington Market\n", | |
| "M6T,Not assigned,Not assigned\n", | |
| "M7T,Not assigned,Not assigned\n", | |
| "M8T,Not assigned,Not assigned\n", | |
| "M9T,Not assigned,Not assigned\n", | |
| "M1V,Scarborough,Agincourt North\n", | |
| "M1V,Scarborough,L'Amoreaux East\n", | |
| "M1V,Scarborough,Milliken\n", | |
| "M1V,Scarborough,Steeles East\n", | |
| "M2V,Not assigned,Not assigned\n", | |
| "M3V,Not assigned,Not assigned\n", | |
| "M4V,Central Toronto,Deer Park\n", | |
| "M4V,Central Toronto,Forest Hill SE\n", | |
| "M4V,Central Toronto,Rathnelly\n", | |
| "M4V,Central Toronto,South Hill\n", | |
| "M4V,Central Toronto,Summerhill West\n", | |
| "M5V,Downtown Toronto,CN Tower\n", | |
| "M5V,Downtown Toronto,Bathurst Quay\n", | |
| "M5V,Downtown Toronto,Island airport\n", | |
| "M5V,Downtown Toronto,Harbourfront West\n", | |
| "M5V,Downtown Toronto,King and Spadina\n", | |
| "M5V,Downtown Toronto,Railway Lands\n", | |
| "M5V,Downtown Toronto,South Niagara\n", | |
| "M6V,Not assigned,Not assigned\n", | |
| "M7V,Not assigned,Not assigned\n", | |
| "M8V,Etobicoke,Humber Bay Shores\n", | |
| "M8V,Etobicoke,Mimico South\n", | |
| "M8V,Etobicoke,New Toronto\n", | |
| "M9V,Etobicoke,Albion Gardens\n", | |
| "M9V,Etobicoke,Beaumond Heights\n", | |
| "M9V,Etobicoke,Humbergate\n", | |
| "M9V,Etobicoke,Jamestown\n", | |
| "M9V,Etobicoke,Mount Olive\n", | |
| "M9V,Etobicoke,Silverstone\n", | |
| "M9V,Etobicoke,South Steeles\n", | |
| "M9V,Etobicoke,Thistletown\n", | |
| "M1W,Scarborough,L'Amoreaux West\n", | |
| "M2W,Not assigned,Not assigned\n", | |
| "M3W,Not assigned,Not assigned\n", | |
| "M4W,Downtown Toronto,Rosedale\n", | |
| "M5W,Downtown Toronto,Stn A PO Boxes 25 The Esplanade\n", | |
| "M6W,Not assigned,Not assigned\n", | |
| "M7W,Not assigned,Not assigned\n", | |
| "M8W,Etobicoke,Alderwood\n", | |
| "M8W,Etobicoke,Long Branch\n", | |
| "M9W,Etobicoke,Northwest\n", | |
| "M1X,Scarborough,Upper Rouge\n", | |
| "M2X,Not assigned,Not assigned\n", | |
| "M3X,Not assigned,Not assigned\n", | |
| "M4X,Downtown Toronto,Cabbagetown\n", | |
| "M4X,Downtown Toronto,St. James Town\n", | |
| "M5X,Downtown Toronto,First Canadian Place\n", | |
| "M5X,Downtown Toronto,Underground city\n", | |
| "M6X,Not assigned,Not assigned\n", | |
| "M7X,Not assigned,Not assigned\n", | |
| "M8X,Etobicoke,The Kingsway\n", | |
| "M8X,Etobicoke,Montgomery Road\n", | |
| "M8X,Etobicoke,Old Mill North\n", | |
| "M9X,Not assigned,Not assigned\n", | |
| "M1Y,Not assigned,Not assigned\n", | |
| "M2Y,Not assigned,Not assigned\n", | |
| "M3Y,Not assigned,Not assigned\n", | |
| "M4Y,Downtown Toronto,Church and Wellesley\n", | |
| "M5Y,Not assigned,Not assigned\n", | |
| "M6Y,Not assigned,Not assigned\n", | |
| "M7Y,East Toronto,Business Reply Mail Processing Centre 969 Eastern\n", | |
| "M8Y,Etobicoke,Humber Bay\n", | |
| "M8Y,Etobicoke,King's Mill Park\n", | |
| "M8Y,Etobicoke,Kingsway Park South East\n", | |
| "M8Y,Etobicoke,Mimico NE\n", | |
| "M8Y,Etobicoke,Old Mill South\n", | |
| "M8Y,Etobicoke,The Queensway East\n", | |
| "M8Y,Etobicoke,Royal York South East\n", | |
| "M8Y,Etobicoke,Sunnylea\n", | |
| "M9Y,Not assigned,Not assigned\n", | |
| "M1Z,Not assigned,Not assigned\n", | |
| "M2Z,Not assigned,Not assigned\n", | |
| "M3Z,Not assigned,Not assigned\n", | |
| "M4Z,Not assigned,Not assigned\n", | |
| "M5Z,Not assigned,Not assigned\n", | |
| "M6Z,Not assigned,Not assigned\n", | |
| "M7Z,Not assigned,Not assigned\n", | |
| "M8Z,Etobicoke,Kingsway Park South West\n", | |
| "M8Z,Etobicoke,Mimico NW\n", | |
| "M8Z,Etobicoke,The Queensway West\n", | |
| "M8Z,Etobicoke,Royal York South West\n", | |
| "M8Z,Etobicoke,South of Bloor\n", | |
| "M9Z,Not assigned,Not assigned\n", | |
| "\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "# Get tr values and seperate with \",\"\n", | |
| "table1=\"\"\n", | |
| "for tr in My_table.find_all('tr'):\n", | |
| " row1=\"\"\n", | |
| " for tds in tr.find_all('td'):\n", | |
| " row1=row1+\",\"+tds.text\n", | |
| " table1=table1+row1[1:]\n", | |
| "print(table1)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 12, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "8738" | |
| ] | |
| }, | |
| "execution_count": 12, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "# export to .cvs file for safe keeping\n", | |
| "file=open(\"toronto.csv\",\"wb\")\n", | |
| "#file.write(bytes(headers,encoding=\"ascii\",errors=\"ignore\"))\n", | |
| "file.write(bytes(table1,encoding=\"ascii\",errors=\"ignore\"))" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 13, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<div>\n", | |
| "<style scoped>\n", | |
| " .dataframe tbody tr th:only-of-type {\n", | |
| " vertical-align: middle;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe tbody tr th {\n", | |
| " vertical-align: top;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe thead th {\n", | |
| " text-align: right;\n", | |
| " }\n", | |
| "</style>\n", | |
| "<table border=\"1\" class=\"dataframe\">\n", | |
| " <thead>\n", | |
| " <tr style=\"text-align: right;\">\n", | |
| " <th></th>\n", | |
| " <th>Postalcode</th>\n", | |
| " <th>Borough</th>\n", | |
| " <th>Neighbourhood</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>0</th>\n", | |
| " <td>M1A</td>\n", | |
| " <td>Not assigned</td>\n", | |
| " <td>Not assigned</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>1</th>\n", | |
| " <td>M2A</td>\n", | |
| " <td>Not assigned</td>\n", | |
| " <td>Not assigned</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>2</th>\n", | |
| " <td>M3A</td>\n", | |
| " <td>North York</td>\n", | |
| " <td>Parkwoods</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>3</th>\n", | |
| " <td>M4A</td>\n", | |
| " <td>North York</td>\n", | |
| " <td>Victoria Village</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>4</th>\n", | |
| " <td>M5A</td>\n", | |
| " <td>Downtown Toronto</td>\n", | |
| " <td>Harbourfront</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>5</th>\n", | |
| " <td>M5A</td>\n", | |
| " <td>Downtown Toronto</td>\n", | |
| " <td>Regent Park</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>6</th>\n", | |
| " <td>M6A</td>\n", | |
| " <td>North York</td>\n", | |
| " <td>Lawrence Heights</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>7</th>\n", | |
| " <td>M6A</td>\n", | |
| " <td>North York</td>\n", | |
| " <td>Lawrence Manor</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>8</th>\n", | |
| " <td>M7A</td>\n", | |
| " <td>Queen's Park</td>\n", | |
| " <td>Not assigned</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>9</th>\n", | |
| " <td>M8A</td>\n", | |
| " <td>Not assigned</td>\n", | |
| " <td>Not assigned</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " Postalcode Borough Neighbourhood\n", | |
| "0 M1A Not assigned Not assigned\n", | |
| "1 M2A Not assigned Not assigned\n", | |
| "2 M3A North York Parkwoods\n", | |
| "3 M4A North York Victoria Village\n", | |
| "4 M5A Downtown Toronto Harbourfront\n", | |
| "5 M5A Downtown Toronto Regent Park\n", | |
| "6 M6A North York Lawrence Heights\n", | |
| "7 M6A North York Lawrence Manor\n", | |
| "8 M7A Queen's Park Not assigned\n", | |
| "9 M8A Not assigned Not assigned" | |
| ] | |
| }, | |
| "execution_count": 13, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "import pandas as pd\n", | |
| "df = pd.read_csv('toronto.csv',header=None)\n", | |
| "df.columns=[\"Postalcode\",\"Borough\",\"Neighbourhood\"]\n", | |
| "df.head(10)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 14, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<div>\n", | |
| "<style scoped>\n", | |
| " .dataframe tbody tr th:only-of-type {\n", | |
| " vertical-align: middle;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe tbody tr th {\n", | |
| " vertical-align: top;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe thead th {\n", | |
| " text-align: right;\n", | |
| " }\n", | |
| "</style>\n", | |
| "<table border=\"1\" class=\"dataframe\">\n", | |
| " <thead>\n", | |
| " <tr style=\"text-align: right;\">\n", | |
| " <th></th>\n", | |
| " <th>Postalcode</th>\n", | |
| " <th>Borough</th>\n", | |
| " <th>Neighbourhood</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>2</th>\n", | |
| " <td>M3A</td>\n", | |
| " <td>North York</td>\n", | |
| " <td>Parkwoods</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>3</th>\n", | |
| " <td>M4A</td>\n", | |
| " <td>North York</td>\n", | |
| " <td>Victoria Village</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>4</th>\n", | |
| " <td>M5A</td>\n", | |
| " <td>Downtown Toronto</td>\n", | |
| " <td>Harbourfront</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>5</th>\n", | |
| " <td>M5A</td>\n", | |
| " <td>Downtown Toronto</td>\n", | |
| " <td>Regent Park</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>6</th>\n", | |
| " <td>M6A</td>\n", | |
| " <td>North York</td>\n", | |
| " <td>Lawrence Heights</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>7</th>\n", | |
| " <td>M6A</td>\n", | |
| " <td>North York</td>\n", | |
| " <td>Lawrence Manor</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>8</th>\n", | |
| " <td>M7A</td>\n", | |
| " <td>Queen's Park</td>\n", | |
| " <td>Not assigned</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>10</th>\n", | |
| " <td>M9A</td>\n", | |
| " <td>Etobicoke</td>\n", | |
| " <td>Islington Avenue</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>11</th>\n", | |
| " <td>M1B</td>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>Rouge</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>12</th>\n", | |
| " <td>M1B</td>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>Malvern</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " Postalcode Borough Neighbourhood\n", | |
| "2 M3A North York Parkwoods\n", | |
| "3 M4A North York Victoria Village\n", | |
| "4 M5A Downtown Toronto Harbourfront\n", | |
| "5 M5A Downtown Toronto Regent Park\n", | |
| "6 M6A North York Lawrence Heights\n", | |
| "7 M6A North York Lawrence Manor\n", | |
| "8 M7A Queen's Park Not assigned\n", | |
| "10 M9A Etobicoke Islington Avenue\n", | |
| "11 M1B Scarborough Rouge\n", | |
| "12 M1B Scarborough Malvern" | |
| ] | |
| }, | |
| "execution_count": 14, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "# Get names of indexes for which column Borough has value \"Not assigned\"\n", | |
| "indexNames = df[ df['Borough'] =='Not assigned'].index\n", | |
| "\n", | |
| "# Delete the row indexes from the dataFrame\n", | |
| "df.drop(indexNames , inplace=True)\n", | |
| "df.head(10)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 15, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<div>\n", | |
| "<style scoped>\n", | |
| " .dataframe tbody tr th:only-of-type {\n", | |
| " vertical-align: middle;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe tbody tr th {\n", | |
| " vertical-align: top;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe thead th {\n", | |
| " text-align: right;\n", | |
| " }\n", | |
| "</style>\n", | |
| "<table border=\"1\" class=\"dataframe\">\n", | |
| " <thead>\n", | |
| " <tr style=\"text-align: right;\">\n", | |
| " <th></th>\n", | |
| " <th>Postalcode</th>\n", | |
| " <th>Borough</th>\n", | |
| " <th>Neighbourhood</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>2</th>\n", | |
| " <td>M3A</td>\n", | |
| " <td>North York</td>\n", | |
| " <td>Parkwoods</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>3</th>\n", | |
| " <td>M4A</td>\n", | |
| " <td>North York</td>\n", | |
| " <td>Victoria Village</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>4</th>\n", | |
| " <td>M5A</td>\n", | |
| " <td>Downtown Toronto</td>\n", | |
| " <td>Harbourfront</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>5</th>\n", | |
| " <td>M5A</td>\n", | |
| " <td>Downtown Toronto</td>\n", | |
| " <td>Regent Park</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>6</th>\n", | |
| " <td>M6A</td>\n", | |
| " <td>North York</td>\n", | |
| " <td>Lawrence Heights</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>7</th>\n", | |
| " <td>M6A</td>\n", | |
| " <td>North York</td>\n", | |
| " <td>Lawrence Manor</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>8</th>\n", | |
| " <td>M7A</td>\n", | |
| " <td>Queen's Park</td>\n", | |
| " <td>Queen's Park</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>10</th>\n", | |
| " <td>M9A</td>\n", | |
| " <td>Etobicoke</td>\n", | |
| " <td>Islington Avenue</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>11</th>\n", | |
| " <td>M1B</td>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>Rouge</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>12</th>\n", | |
| " <td>M1B</td>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>Malvern</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " Postalcode Borough Neighbourhood\n", | |
| "2 M3A North York Parkwoods\n", | |
| "3 M4A North York Victoria Village\n", | |
| "4 M5A Downtown Toronto Harbourfront\n", | |
| "5 M5A Downtown Toronto Regent Park\n", | |
| "6 M6A North York Lawrence Heights\n", | |
| "7 M6A North York Lawrence Manor\n", | |
| "8 M7A Queen's Park Queen's Park\n", | |
| "10 M9A Etobicoke Islington Avenue\n", | |
| "11 M1B Scarborough Rouge\n", | |
| "12 M1B Scarborough Malvern" | |
| ] | |
| }, | |
| "execution_count": 15, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "# If a cell has a borough but is Not assigned a neighborhood, then the neighborhood equals the borough\n", | |
| "df.loc[df['Neighbourhood'] =='Not assigned' , 'Neighbourhood'] = df['Borough']\n", | |
| "df.head(10)\n", | |
| "\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 17, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "# All rows with same postalcode will combined into one row with the neighborhoods separated by a comma\n", | |
| "result = df.groupby(['Postalcode','Borough'], sort=False).agg( ', '.join)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 18, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<div>\n", | |
| "<style scoped>\n", | |
| " .dataframe tbody tr th:only-of-type {\n", | |
| " vertical-align: middle;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe tbody tr th {\n", | |
| " vertical-align: top;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe thead th {\n", | |
| " text-align: right;\n", | |
| " }\n", | |
| "</style>\n", | |
| "<table border=\"1\" class=\"dataframe\">\n", | |
| " <thead>\n", | |
| " <tr style=\"text-align: right;\">\n", | |
| " <th></th>\n", | |
| " <th>Postalcode</th>\n", | |
| " <th>Borough</th>\n", | |
| " <th>Neighbourhood</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>0</th>\n", | |
| " <td>M3A</td>\n", | |
| " <td>North York</td>\n", | |
| " <td>Parkwoods</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>1</th>\n", | |
| " <td>M4A</td>\n", | |
| " <td>North York</td>\n", | |
| " <td>Victoria Village</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>2</th>\n", | |
| " <td>M5A</td>\n", | |
| " <td>Downtown Toronto</td>\n", | |
| " <td>Harbourfront, Regent Park</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>3</th>\n", | |
| " <td>M6A</td>\n", | |
| " <td>North York</td>\n", | |
| " <td>Lawrence Heights, Lawrence Manor</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>4</th>\n", | |
| " <td>M7A</td>\n", | |
| " <td>Queen's Park</td>\n", | |
| " <td>Queen's Park</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>5</th>\n", | |
| " <td>M9A</td>\n", | |
| " <td>Etobicoke</td>\n", | |
| " <td>Islington Avenue</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>6</th>\n", | |
| " <td>M1B</td>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>Rouge, Malvern</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>7</th>\n", | |
| " <td>M3B</td>\n", | |
| " <td>North York</td>\n", | |
| " <td>Don Mills North</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>8</th>\n", | |
| " <td>M4B</td>\n", | |
| " <td>East York</td>\n", | |
| " <td>Woodbine Gardens, Parkview Hill</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>9</th>\n", | |
| " <td>M5B</td>\n", | |
| " <td>Downtown Toronto</td>\n", | |
| " <td>Ryerson, Garden District</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>10</th>\n", | |
| " <td>M6B</td>\n", | |
| " <td>North York</td>\n", | |
| " <td>Glencairn</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>11</th>\n", | |
| " <td>M9B</td>\n", | |
| " <td>Etobicoke</td>\n", | |
| " <td>Cloverdale, Islington, Martin Grove, Princess ...</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>12</th>\n", | |
| " <td>M1C</td>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>Highland Creek, Rouge Hill, Port Union</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>13</th>\n", | |
| " <td>M3C</td>\n", | |
| " <td>North York</td>\n", | |
| " <td>Flemingdon Park, Don Mills South</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>14</th>\n", | |
| " <td>M4C</td>\n", | |
| " <td>East York</td>\n", | |
| " <td>Woodbine Heights</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " Postalcode Borough \\\n", | |
| "0 M3A North York \n", | |
| "1 M4A North York \n", | |
| "2 M5A Downtown Toronto \n", | |
| "3 M6A North York \n", | |
| "4 M7A Queen's Park \n", | |
| "5 M9A Etobicoke \n", | |
| "6 M1B Scarborough \n", | |
| "7 M3B North York \n", | |
| "8 M4B East York \n", | |
| "9 M5B Downtown Toronto \n", | |
| "10 M6B North York \n", | |
| "11 M9B Etobicoke \n", | |
| "12 M1C Scarborough \n", | |
| "13 M3C North York \n", | |
| "14 M4C East York \n", | |
| "\n", | |
| " Neighbourhood \n", | |
| "0 Parkwoods \n", | |
| "1 Victoria Village \n", | |
| "2 Harbourfront, Regent Park \n", | |
| "3 Lawrence Heights, Lawrence Manor \n", | |
| "4 Queen's Park \n", | |
| "5 Islington Avenue \n", | |
| "6 Rouge, Malvern \n", | |
| "7 Don Mills North \n", | |
| "8 Woodbine Gardens, Parkview Hill \n", | |
| "9 Ryerson, Garden District \n", | |
| "10 Glencairn \n", | |
| "11 Cloverdale, Islington, Martin Grove, Princess ... \n", | |
| "12 Highland Creek, Rouge Hill, Port Union \n", | |
| "13 Flemingdon Park, Don Mills South \n", | |
| "14 Woodbine Heights " | |
| ] | |
| }, | |
| "execution_count": 18, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "df_new=result.reset_index()\n", | |
| "df_new.head(15)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 19, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "(103, 3)" | |
| ] | |
| }, | |
| "execution_count": 19, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "# use the .shape method to print the number of rows of the dataframe\n", | |
| "df_new.shape" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "## Now, Use Geocoder to create Long and Lat values" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 21, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<div>\n", | |
| "<style scoped>\n", | |
| " .dataframe tbody tr th:only-of-type {\n", | |
| " vertical-align: middle;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe tbody tr th {\n", | |
| " vertical-align: top;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe thead th {\n", | |
| " text-align: right;\n", | |
| " }\n", | |
| "</style>\n", | |
| "<table border=\"1\" class=\"dataframe\">\n", | |
| " <thead>\n", | |
| " <tr style=\"text-align: right;\">\n", | |
| " <th></th>\n", | |
| " <th>Postal Code</th>\n", | |
| " <th>Latitude</th>\n", | |
| " <th>Longitude</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>0</th>\n", | |
| " <td>M1B</td>\n", | |
| " <td>43.806686</td>\n", | |
| " <td>-79.194353</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>1</th>\n", | |
| " <td>M1C</td>\n", | |
| " <td>43.784535</td>\n", | |
| " <td>-79.160497</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>2</th>\n", | |
| " <td>M1E</td>\n", | |
| " <td>43.763573</td>\n", | |
| " <td>-79.188711</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>3</th>\n", | |
| " <td>M1G</td>\n", | |
| " <td>43.770992</td>\n", | |
| " <td>-79.216917</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>4</th>\n", | |
| " <td>M1H</td>\n", | |
| " <td>43.773136</td>\n", | |
| " <td>-79.239476</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " Postal Code Latitude Longitude\n", | |
| "0 M1B 43.806686 -79.194353\n", | |
| "1 M1C 43.784535 -79.160497\n", | |
| "2 M1E 43.763573 -79.188711\n", | |
| "3 M1G 43.770992 -79.216917\n", | |
| "4 M1H 43.773136 -79.239476" | |
| ] | |
| }, | |
| "execution_count": 21, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "!wget -q -O 'Toronto_long_lat_data.csv' http://cocl.us/Geospatial_data\n", | |
| "df_lon_lat = pd.read_csv('Toronto_long_lat_data.csv')\n", | |
| "df_lon_lat.head()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 22, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<div>\n", | |
| "<style scoped>\n", | |
| " .dataframe tbody tr th:only-of-type {\n", | |
| " vertical-align: middle;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe tbody tr th {\n", | |
| " vertical-align: top;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe thead th {\n", | |
| " text-align: right;\n", | |
| " }\n", | |
| "</style>\n", | |
| "<table border=\"1\" class=\"dataframe\">\n", | |
| " <thead>\n", | |
| " <tr style=\"text-align: right;\">\n", | |
| " <th></th>\n", | |
| " <th>Postalcode</th>\n", | |
| " <th>Latitude</th>\n", | |
| " <th>Longitude</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>0</th>\n", | |
| " <td>M1B</td>\n", | |
| " <td>43.806686</td>\n", | |
| " <td>-79.194353</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>1</th>\n", | |
| " <td>M1C</td>\n", | |
| " <td>43.784535</td>\n", | |
| " <td>-79.160497</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>2</th>\n", | |
| " <td>M1E</td>\n", | |
| " <td>43.763573</td>\n", | |
| " <td>-79.188711</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>3</th>\n", | |
| " <td>M1G</td>\n", | |
| " <td>43.770992</td>\n", | |
| " <td>-79.216917</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>4</th>\n", | |
| " <td>M1H</td>\n", | |
| " <td>43.773136</td>\n", | |
| " <td>-79.239476</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " Postalcode Latitude Longitude\n", | |
| "0 M1B 43.806686 -79.194353\n", | |
| "1 M1C 43.784535 -79.160497\n", | |
| "2 M1E 43.763573 -79.188711\n", | |
| "3 M1G 43.770992 -79.216917\n", | |
| "4 M1H 43.773136 -79.239476" | |
| ] | |
| }, | |
| "execution_count": 22, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "df_lon_lat.columns=['Postalcode','Latitude','Longitude']\n", | |
| "df_lon_lat.head()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 23, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<div>\n", | |
| "<style scoped>\n", | |
| " .dataframe tbody tr th:only-of-type {\n", | |
| " vertical-align: middle;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe tbody tr th {\n", | |
| " vertical-align: top;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe thead th {\n", | |
| " text-align: right;\n", | |
| " }\n", | |
| "</style>\n", | |
| "<table border=\"1\" class=\"dataframe\">\n", | |
| " <thead>\n", | |
| " <tr style=\"text-align: right;\">\n", | |
| " <th></th>\n", | |
| " <th>Postalcode</th>\n", | |
| " <th>Borough</th>\n", | |
| " <th>Neighbourhood</th>\n", | |
| " <th>Latitude</th>\n", | |
| " <th>Longitude</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>0</th>\n", | |
| " <td>M3A</td>\n", | |
| " <td>North York</td>\n", | |
| " <td>Parkwoods</td>\n", | |
| " <td>43.753259</td>\n", | |
| " <td>-79.329656</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>1</th>\n", | |
| " <td>M4A</td>\n", | |
| " <td>North York</td>\n", | |
| " <td>Victoria Village</td>\n", | |
| " <td>43.725882</td>\n", | |
| " <td>-79.315572</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>2</th>\n", | |
| " <td>M5A</td>\n", | |
| " <td>Downtown Toronto</td>\n", | |
| " <td>Harbourfront, Regent Park</td>\n", | |
| " <td>43.654260</td>\n", | |
| " <td>-79.360636</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>3</th>\n", | |
| " <td>M6A</td>\n", | |
| " <td>North York</td>\n", | |
| " <td>Lawrence Heights, Lawrence Manor</td>\n", | |
| " <td>43.718518</td>\n", | |
| " <td>-79.464763</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>4</th>\n", | |
| " <td>M7A</td>\n", | |
| " <td>Queen's Park</td>\n", | |
| " <td>Queen's Park</td>\n", | |
| " <td>43.662301</td>\n", | |
| " <td>-79.389494</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>5</th>\n", | |
| " <td>M9A</td>\n", | |
| " <td>Etobicoke</td>\n", | |
| " <td>Islington Avenue</td>\n", | |
| " <td>43.667856</td>\n", | |
| " <td>-79.532242</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>6</th>\n", | |
| " <td>M1B</td>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>Rouge, Malvern</td>\n", | |
| " <td>43.806686</td>\n", | |
| " <td>-79.194353</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>7</th>\n", | |
| " <td>M3B</td>\n", | |
| " <td>North York</td>\n", | |
| " <td>Don Mills North</td>\n", | |
| " <td>43.745906</td>\n", | |
| " <td>-79.352188</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>8</th>\n", | |
| " <td>M4B</td>\n", | |
| " <td>East York</td>\n", | |
| " <td>Woodbine Gardens, Parkview Hill</td>\n", | |
| " <td>43.706397</td>\n", | |
| " <td>-79.309937</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>9</th>\n", | |
| " <td>M5B</td>\n", | |
| " <td>Downtown Toronto</td>\n", | |
| " <td>Ryerson, Garden District</td>\n", | |
| " <td>43.657162</td>\n", | |
| " <td>-79.378937</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>10</th>\n", | |
| " <td>M6B</td>\n", | |
| " <td>North York</td>\n", | |
| " <td>Glencairn</td>\n", | |
| " <td>43.709577</td>\n", | |
| " <td>-79.445073</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>11</th>\n", | |
| " <td>M9B</td>\n", | |
| " <td>Etobicoke</td>\n", | |
| " <td>Cloverdale, Islington, Martin Grove, Princess ...</td>\n", | |
| " <td>43.650943</td>\n", | |
| " <td>-79.554724</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>12</th>\n", | |
| " <td>M1C</td>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>Highland Creek, Rouge Hill, Port Union</td>\n", | |
| " <td>43.784535</td>\n", | |
| " <td>-79.160497</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>13</th>\n", | |
| " <td>M3C</td>\n", | |
| " <td>North York</td>\n", | |
| " <td>Flemingdon Park, Don Mills South</td>\n", | |
| " <td>43.725900</td>\n", | |
| " <td>-79.340923</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>14</th>\n", | |
| " <td>M4C</td>\n", | |
| " <td>East York</td>\n", | |
| " <td>Woodbine Heights</td>\n", | |
| " <td>43.695344</td>\n", | |
| " <td>-79.318389</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>15</th>\n", | |
| " <td>M5C</td>\n", | |
| " <td>Downtown Toronto</td>\n", | |
| " <td>St. James Town</td>\n", | |
| " <td>43.651494</td>\n", | |
| " <td>-79.375418</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>16</th>\n", | |
| " <td>M6C</td>\n", | |
| " <td>York</td>\n", | |
| " <td>Humewood-Cedarvale</td>\n", | |
| " <td>43.693781</td>\n", | |
| " <td>-79.428191</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>17</th>\n", | |
| " <td>M9C</td>\n", | |
| " <td>Etobicoke</td>\n", | |
| " <td>Bloordale Gardens, Eringate, Markland Wood, Ol...</td>\n", | |
| " <td>43.643515</td>\n", | |
| " <td>-79.577201</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>18</th>\n", | |
| " <td>M1E</td>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>Guildwood, Morningside, West Hill</td>\n", | |
| " <td>43.763573</td>\n", | |
| " <td>-79.188711</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>19</th>\n", | |
| " <td>M4E</td>\n", | |
| " <td>East Toronto</td>\n", | |
| " <td>The Beaches</td>\n", | |
| " <td>43.676357</td>\n", | |
| " <td>-79.293031</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>20</th>\n", | |
| " <td>M5E</td>\n", | |
| " <td>Downtown Toronto</td>\n", | |
| " <td>Berczy Park</td>\n", | |
| " <td>43.644771</td>\n", | |
| " <td>-79.373306</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>21</th>\n", | |
| " <td>M6E</td>\n", | |
| " <td>York</td>\n", | |
| " <td>Caledonia-Fairbanks</td>\n", | |
| " <td>43.689026</td>\n", | |
| " <td>-79.453512</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>22</th>\n", | |
| " <td>M1G</td>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>Woburn</td>\n", | |
| " <td>43.770992</td>\n", | |
| " <td>-79.216917</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>23</th>\n", | |
| " <td>M4G</td>\n", | |
| " <td>East York</td>\n", | |
| " <td>Leaside</td>\n", | |
| " <td>43.709060</td>\n", | |
| " <td>-79.363452</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>24</th>\n", | |
| " <td>M5G</td>\n", | |
| " <td>Downtown Toronto</td>\n", | |
| " <td>Central Bay Street</td>\n", | |
| " <td>43.657952</td>\n", | |
| " <td>-79.387383</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>25</th>\n", | |
| " <td>M6G</td>\n", | |
| " <td>Downtown Toronto</td>\n", | |
| " <td>Christie</td>\n", | |
| " <td>43.669542</td>\n", | |
| " <td>-79.422564</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>26</th>\n", | |
| " <td>M1H</td>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>Cedarbrae</td>\n", | |
| " <td>43.773136</td>\n", | |
| " <td>-79.239476</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>27</th>\n", | |
| " <td>M2H</td>\n", | |
| " <td>North York</td>\n", | |
| " <td>Hillcrest Village</td>\n", | |
| " <td>43.803762</td>\n", | |
| " <td>-79.363452</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>28</th>\n", | |
| " <td>M3H</td>\n", | |
| " <td>North York</td>\n", | |
| " <td>Bathurst Manor, Downsview North, Wilson Heights</td>\n", | |
| " <td>43.754328</td>\n", | |
| " <td>-79.442259</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>29</th>\n", | |
| " <td>M4H</td>\n", | |
| " <td>East York</td>\n", | |
| " <td>Thorncliffe Park</td>\n", | |
| " <td>43.705369</td>\n", | |
| " <td>-79.349372</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>...</th>\n", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>73</th>\n", | |
| " <td>M4R</td>\n", | |
| " <td>Central Toronto</td>\n", | |
| " <td>North Toronto West</td>\n", | |
| " <td>43.715383</td>\n", | |
| " <td>-79.405678</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>74</th>\n", | |
| " <td>M5R</td>\n", | |
| " <td>Central Toronto</td>\n", | |
| " <td>The Annex, North Midtown, Yorkville</td>\n", | |
| " <td>43.672710</td>\n", | |
| " <td>-79.405678</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>75</th>\n", | |
| " <td>M6R</td>\n", | |
| " <td>West Toronto</td>\n", | |
| " <td>Parkdale, Roncesvalles</td>\n", | |
| " <td>43.648960</td>\n", | |
| " <td>-79.456325</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>76</th>\n", | |
| " <td>M7R</td>\n", | |
| " <td>Mississauga</td>\n", | |
| " <td>Canada Post Gateway Processing Centre</td>\n", | |
| " <td>43.636966</td>\n", | |
| " <td>-79.615819</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>77</th>\n", | |
| " <td>M9R</td>\n", | |
| " <td>Etobicoke</td>\n", | |
| " <td>Kingsview Village, Martin Grove Gardens, Richv...</td>\n", | |
| " <td>43.688905</td>\n", | |
| " <td>-79.554724</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>78</th>\n", | |
| " <td>M1S</td>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>Agincourt</td>\n", | |
| " <td>43.794200</td>\n", | |
| " <td>-79.262029</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>79</th>\n", | |
| " <td>M4S</td>\n", | |
| " <td>Central Toronto</td>\n", | |
| " <td>Davisville</td>\n", | |
| " <td>43.704324</td>\n", | |
| " <td>-79.388790</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>80</th>\n", | |
| " <td>M5S</td>\n", | |
| " <td>Downtown Toronto</td>\n", | |
| " <td>Harbord, University of Toronto</td>\n", | |
| " <td>43.662696</td>\n", | |
| " <td>-79.400049</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>81</th>\n", | |
| " <td>M6S</td>\n", | |
| " <td>West Toronto</td>\n", | |
| " <td>Runnymede, Swansea</td>\n", | |
| " <td>43.651571</td>\n", | |
| " <td>-79.484450</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>82</th>\n", | |
| " <td>M1T</td>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>Clarks Corners, Sullivan, Tam O'Shanter</td>\n", | |
| " <td>43.781638</td>\n", | |
| " <td>-79.304302</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>83</th>\n", | |
| " <td>M4T</td>\n", | |
| " <td>Central Toronto</td>\n", | |
| " <td>Moore Park, Summerhill East</td>\n", | |
| " <td>43.689574</td>\n", | |
| " <td>-79.383160</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>84</th>\n", | |
| " <td>M5T</td>\n", | |
| " <td>Downtown Toronto</td>\n", | |
| " <td>Chinatown, Grange Park, Kensington Market</td>\n", | |
| " <td>43.653206</td>\n", | |
| " <td>-79.400049</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>85</th>\n", | |
| " <td>M1V</td>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>Agincourt North, L'Amoreaux East, Milliken, St...</td>\n", | |
| " <td>43.815252</td>\n", | |
| " <td>-79.284577</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>86</th>\n", | |
| " <td>M4V</td>\n", | |
| " <td>Central Toronto</td>\n", | |
| " <td>Deer Park, Forest Hill SE, Rathnelly, South Hi...</td>\n", | |
| " <td>43.686412</td>\n", | |
| " <td>-79.400049</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>87</th>\n", | |
| " <td>M5V</td>\n", | |
| " <td>Downtown Toronto</td>\n", | |
| " <td>CN Tower, Bathurst Quay, Island airport, Harbo...</td>\n", | |
| " <td>43.628947</td>\n", | |
| " <td>-79.394420</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>88</th>\n", | |
| " <td>M8V</td>\n", | |
| " <td>Etobicoke</td>\n", | |
| " <td>Humber Bay Shores, Mimico South, New Toronto</td>\n", | |
| " <td>43.605647</td>\n", | |
| " <td>-79.501321</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>89</th>\n", | |
| " <td>M9V</td>\n", | |
| " <td>Etobicoke</td>\n", | |
| " <td>Albion Gardens, Beaumond Heights, Humbergate, ...</td>\n", | |
| " <td>43.739416</td>\n", | |
| " <td>-79.588437</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>90</th>\n", | |
| " <td>M1W</td>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>L'Amoreaux West</td>\n", | |
| " <td>43.799525</td>\n", | |
| " <td>-79.318389</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>91</th>\n", | |
| " <td>M4W</td>\n", | |
| " <td>Downtown Toronto</td>\n", | |
| " <td>Rosedale</td>\n", | |
| " <td>43.679563</td>\n", | |
| " <td>-79.377529</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>92</th>\n", | |
| " <td>M5W</td>\n", | |
| " <td>Downtown Toronto</td>\n", | |
| " <td>Stn A PO Boxes 25 The Esplanade</td>\n", | |
| " <td>43.646435</td>\n", | |
| " <td>-79.374846</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>93</th>\n", | |
| " <td>M8W</td>\n", | |
| " <td>Etobicoke</td>\n", | |
| " <td>Alderwood, Long Branch</td>\n", | |
| " <td>43.602414</td>\n", | |
| " <td>-79.543484</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>94</th>\n", | |
| " <td>M9W</td>\n", | |
| " <td>Etobicoke</td>\n", | |
| " <td>Northwest</td>\n", | |
| " <td>43.706748</td>\n", | |
| " <td>-79.594054</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>95</th>\n", | |
| " <td>M1X</td>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>Upper Rouge</td>\n", | |
| " <td>43.836125</td>\n", | |
| " <td>-79.205636</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>96</th>\n", | |
| " <td>M4X</td>\n", | |
| " <td>Downtown Toronto</td>\n", | |
| " <td>Cabbagetown, St. James Town</td>\n", | |
| " <td>43.667967</td>\n", | |
| " <td>-79.367675</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>97</th>\n", | |
| " <td>M5X</td>\n", | |
| " <td>Downtown Toronto</td>\n", | |
| " <td>First Canadian Place, Underground city</td>\n", | |
| " <td>43.648429</td>\n", | |
| " <td>-79.382280</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>98</th>\n", | |
| " <td>M8X</td>\n", | |
| " <td>Etobicoke</td>\n", | |
| " <td>The Kingsway, Montgomery Road, Old Mill North</td>\n", | |
| " <td>43.653654</td>\n", | |
| " <td>-79.506944</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>99</th>\n", | |
| " <td>M4Y</td>\n", | |
| " <td>Downtown Toronto</td>\n", | |
| " <td>Church and Wellesley</td>\n", | |
| " <td>43.665860</td>\n", | |
| " <td>-79.383160</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>100</th>\n", | |
| " <td>M7Y</td>\n", | |
| " <td>East Toronto</td>\n", | |
| " <td>Business Reply Mail Processing Centre 969 Eastern</td>\n", | |
| " <td>43.662744</td>\n", | |
| " <td>-79.321558</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>101</th>\n", | |
| " <td>M8Y</td>\n", | |
| " <td>Etobicoke</td>\n", | |
| " <td>Humber Bay, King's Mill Park, Kingsway Park So...</td>\n", | |
| " <td>43.636258</td>\n", | |
| " <td>-79.498509</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>102</th>\n", | |
| " <td>M8Z</td>\n", | |
| " <td>Etobicoke</td>\n", | |
| " <td>Kingsway Park South West, Mimico NW, The Queen...</td>\n", | |
| " <td>43.628841</td>\n", | |
| " <td>-79.520999</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "<p>103 rows × 5 columns</p>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " Postalcode Borough \\\n", | |
| "0 M3A North York \n", | |
| "1 M4A North York \n", | |
| "2 M5A Downtown Toronto \n", | |
| "3 M6A North York \n", | |
| "4 M7A Queen's Park \n", | |
| "5 M9A Etobicoke \n", | |
| "6 M1B Scarborough \n", | |
| "7 M3B North York \n", | |
| "8 M4B East York \n", | |
| "9 M5B Downtown Toronto \n", | |
| "10 M6B North York \n", | |
| "11 M9B Etobicoke \n", | |
| "12 M1C Scarborough \n", | |
| "13 M3C North York \n", | |
| "14 M4C East York \n", | |
| "15 M5C Downtown Toronto \n", | |
| "16 M6C York \n", | |
| "17 M9C Etobicoke \n", | |
| "18 M1E Scarborough \n", | |
| "19 M4E East Toronto \n", | |
| "20 M5E Downtown Toronto \n", | |
| "21 M6E York \n", | |
| "22 M1G Scarborough \n", | |
| "23 M4G East York \n", | |
| "24 M5G Downtown Toronto \n", | |
| "25 M6G Downtown Toronto \n", | |
| "26 M1H Scarborough \n", | |
| "27 M2H North York \n", | |
| "28 M3H North York \n", | |
| "29 M4H East York \n", | |
| ".. ... ... \n", | |
| "73 M4R Central Toronto \n", | |
| "74 M5R Central Toronto \n", | |
| "75 M6R West Toronto \n", | |
| "76 M7R Mississauga \n", | |
| "77 M9R Etobicoke \n", | |
| "78 M1S Scarborough \n", | |
| "79 M4S Central Toronto \n", | |
| "80 M5S Downtown Toronto \n", | |
| "81 M6S West Toronto \n", | |
| "82 M1T Scarborough \n", | |
| "83 M4T Central Toronto \n", | |
| "84 M5T Downtown Toronto \n", | |
| "85 M1V Scarborough \n", | |
| "86 M4V Central Toronto \n", | |
| "87 M5V Downtown Toronto \n", | |
| "88 M8V Etobicoke \n", | |
| "89 M9V Etobicoke \n", | |
| "90 M1W Scarborough \n", | |
| "91 M4W Downtown Toronto \n", | |
| "92 M5W Downtown Toronto \n", | |
| "93 M8W Etobicoke \n", | |
| "94 M9W Etobicoke \n", | |
| "95 M1X Scarborough \n", | |
| "96 M4X Downtown Toronto \n", | |
| "97 M5X Downtown Toronto \n", | |
| "98 M8X Etobicoke \n", | |
| "99 M4Y Downtown Toronto \n", | |
| "100 M7Y East Toronto \n", | |
| "101 M8Y Etobicoke \n", | |
| "102 M8Z Etobicoke \n", | |
| "\n", | |
| " Neighbourhood Latitude Longitude \n", | |
| "0 Parkwoods 43.753259 -79.329656 \n", | |
| "1 Victoria Village 43.725882 -79.315572 \n", | |
| "2 Harbourfront, Regent Park 43.654260 -79.360636 \n", | |
| "3 Lawrence Heights, Lawrence Manor 43.718518 -79.464763 \n", | |
| "4 Queen's Park 43.662301 -79.389494 \n", | |
| "5 Islington Avenue 43.667856 -79.532242 \n", | |
| "6 Rouge, Malvern 43.806686 -79.194353 \n", | |
| "7 Don Mills North 43.745906 -79.352188 \n", | |
| "8 Woodbine Gardens, Parkview Hill 43.706397 -79.309937 \n", | |
| "9 Ryerson, Garden District 43.657162 -79.378937 \n", | |
| "10 Glencairn 43.709577 -79.445073 \n", | |
| "11 Cloverdale, Islington, Martin Grove, Princess ... 43.650943 -79.554724 \n", | |
| "12 Highland Creek, Rouge Hill, Port Union 43.784535 -79.160497 \n", | |
| "13 Flemingdon Park, Don Mills South 43.725900 -79.340923 \n", | |
| "14 Woodbine Heights 43.695344 -79.318389 \n", | |
| "15 St. James Town 43.651494 -79.375418 \n", | |
| "16 Humewood-Cedarvale 43.693781 -79.428191 \n", | |
| "17 Bloordale Gardens, Eringate, Markland Wood, Ol... 43.643515 -79.577201 \n", | |
| "18 Guildwood, Morningside, West Hill 43.763573 -79.188711 \n", | |
| "19 The Beaches 43.676357 -79.293031 \n", | |
| "20 Berczy Park 43.644771 -79.373306 \n", | |
| "21 Caledonia-Fairbanks 43.689026 -79.453512 \n", | |
| "22 Woburn 43.770992 -79.216917 \n", | |
| "23 Leaside 43.709060 -79.363452 \n", | |
| "24 Central Bay Street 43.657952 -79.387383 \n", | |
| "25 Christie 43.669542 -79.422564 \n", | |
| "26 Cedarbrae 43.773136 -79.239476 \n", | |
| "27 Hillcrest Village 43.803762 -79.363452 \n", | |
| "28 Bathurst Manor, Downsview North, Wilson Heights 43.754328 -79.442259 \n", | |
| "29 Thorncliffe Park 43.705369 -79.349372 \n", | |
| ".. ... ... ... \n", | |
| "73 North Toronto West 43.715383 -79.405678 \n", | |
| "74 The Annex, North Midtown, Yorkville 43.672710 -79.405678 \n", | |
| "75 Parkdale, Roncesvalles 43.648960 -79.456325 \n", | |
| "76 Canada Post Gateway Processing Centre 43.636966 -79.615819 \n", | |
| "77 Kingsview Village, Martin Grove Gardens, Richv... 43.688905 -79.554724 \n", | |
| "78 Agincourt 43.794200 -79.262029 \n", | |
| "79 Davisville 43.704324 -79.388790 \n", | |
| "80 Harbord, University of Toronto 43.662696 -79.400049 \n", | |
| "81 Runnymede, Swansea 43.651571 -79.484450 \n", | |
| "82 Clarks Corners, Sullivan, Tam O'Shanter 43.781638 -79.304302 \n", | |
| "83 Moore Park, Summerhill East 43.689574 -79.383160 \n", | |
| "84 Chinatown, Grange Park, Kensington Market 43.653206 -79.400049 \n", | |
| "85 Agincourt North, L'Amoreaux East, Milliken, St... 43.815252 -79.284577 \n", | |
| "86 Deer Park, Forest Hill SE, Rathnelly, South Hi... 43.686412 -79.400049 \n", | |
| "87 CN Tower, Bathurst Quay, Island airport, Harbo... 43.628947 -79.394420 \n", | |
| "88 Humber Bay Shores, Mimico South, New Toronto 43.605647 -79.501321 \n", | |
| "89 Albion Gardens, Beaumond Heights, Humbergate, ... 43.739416 -79.588437 \n", | |
| "90 L'Amoreaux West 43.799525 -79.318389 \n", | |
| "91 Rosedale 43.679563 -79.377529 \n", | |
| "92 Stn A PO Boxes 25 The Esplanade 43.646435 -79.374846 \n", | |
| "93 Alderwood, Long Branch 43.602414 -79.543484 \n", | |
| "94 Northwest 43.706748 -79.594054 \n", | |
| "95 Upper Rouge 43.836125 -79.205636 \n", | |
| "96 Cabbagetown, St. James Town 43.667967 -79.367675 \n", | |
| "97 First Canadian Place, Underground city 43.648429 -79.382280 \n", | |
| "98 The Kingsway, Montgomery Road, Old Mill North 43.653654 -79.506944 \n", | |
| "99 Church and Wellesley 43.665860 -79.383160 \n", | |
| "100 Business Reply Mail Processing Centre 969 Eastern 43.662744 -79.321558 \n", | |
| "101 Humber Bay, King's Mill Park, Kingsway Park So... 43.636258 -79.498509 \n", | |
| "102 Kingsway Park South West, Mimico NW, The Queen... 43.628841 -79.520999 \n", | |
| "\n", | |
| "[103 rows x 5 columns]" | |
| ] | |
| }, | |
| "execution_count": 23, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "Toronto_df = pd.merge(df_new,\n", | |
| " df_lon_lat[['Postalcode','Latitude', 'Longitude']],\n", | |
| " on='Postalcode')\n", | |
| "Toronto_df" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "## Now let's explore the neighborhoods in Toronto" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 24, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Libraries imported.\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "from geopy.geocoders import Nominatim # convert an address into latitude and longitude values\n", | |
| "\n", | |
| "# Matplotlib and associated plotting modules\n", | |
| "import matplotlib.cm as cm\n", | |
| "import matplotlib.colors as colors\n", | |
| "\n", | |
| "# import k-means from clustering stage\n", | |
| "from sklearn.cluster import KMeans\n", | |
| "\n", | |
| "#!conda install -c conda-forge folium=0.5.0 --yes # uncomment this line if you haven't completed the Foursquare API lab\n", | |
| "import folium # map rendering library\n", | |
| "\n", | |
| "print('Libraries imported.')" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 26, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "The geograpical coordinate of Toronto are 43.653963, -79.387207.\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "address = 'Toronto, ON'\n", | |
| "\n", | |
| "geolocator = Nominatim(user_agent=\"Toronto\")\n", | |
| "location = geolocator.geocode(address)\n", | |
| "latitude_toronto = location.latitude\n", | |
| "longitude_toronto = location.longitude\n", | |
| "print('The geograpical coordinate of Toronto are {}, {}.'.format(latitude_toronto, longitude_toronto))" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 27, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfZGQ4MzBlZTY3MWZkNDAxZmIzMDE3YmFhN2JkYjA3NmMgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwX2RkODMwZWU2NzFmZDQwMWZiMzAxN2JhYTdiZGIwNzZjIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF9kZDgzMGVlNjcxZmQ0MDFmYjMwMTdiYWE3YmRiMDc2YyA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF9kZDgzMGVlNjcxZmQ0MDFmYjMwMTdiYWE3YmRiMDc2YycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbNDMuNjUzOTYzLC03OS4zODcyMDddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbTogMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhCb3VuZHM6IGJvdW5kcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyczogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZENvcHlKdW1wOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciB0aWxlX2xheWVyX2E5NGJiNDcwYmI4YjRjNThiNjExZmQwMzI4MTJmZGNkID0gTC50aWxlTGF5ZXIoCiAgICAgICAgICAgICAgICAnaHR0cHM6Ly97c30udGlsZS5vcGVuc3RyZWV0bWFwLm9yZy97en0ve3h9L3t5fS5wbmcnLAogICAgICAgICAgICAgICAgewogICJhdHRyaWJ1dGlvbiI6IG51bGwsCiAgImRldGVjdFJldGluYSI6IGZhbHNlLAogICJtYXhab29tIjogMTgsCiAgIm1pblpvb20iOiAxLAogICJub1dyYXAiOiBmYWxzZSwKICAic3ViZG9tYWlucyI6ICJhYmMiCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RkODMwZWU2NzFmZDQwMWZiMzAxN2JhYTdiZGIwNzZjKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mYWE4NmMxZjk4MjA0NzNjODBkZGE3ZTZhMTk4ZDQxNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc1MzI1ODYsLTc5LjMyOTY1NjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGQ4MzBlZTY3MWZkNDAxZmIzMDE3YmFhN2JkYjA3NmMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjUwNDk0MmUxOWY5NGRkY2I0ZTM1YTFlNmJhYzJhYzggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzcyYzkxZmM4OGYzNDVmMmIzMzhhMjg2MjRhOWU1MTMgPSAkKCc8ZGl2IGlkPSJodG1sXzM3MmM5MWZjODhmMzQ1ZjJiMzM4YTI4NjI0YTllNTEzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QYXJrd29vZHMsIE5vcnRoIFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I1MDQ5NDJlMTlmOTRkZGNiNGUzNWExZTZiYWMyYWM4LnNldENvbnRlbnQoaHRtbF8zNzJjOTFmYzg4ZjM0NWYyYjMzOGEyODYyNGE5ZTUxMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mYWE4NmMxZjk4MjA0NzNjODBkZGE3ZTZhMTk4ZDQxNi5iaW5kUG9wdXAocG9wdXBfYjUwNDk0MmUxOWY5NGRkY2I0ZTM1YTFlNmJhYzJhYzgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfM2FlYWM5ZjU4ZDkxNDI5MDhlNDcxODYwNjI3NTdiMjggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MjU4ODIyOTk5OTk5OTUsLTc5LjMxNTU3MTU5OTk5OTk4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RkODMwZWU2NzFmZDQwMWZiMzAxN2JhYTdiZGIwNzZjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E3OGFhYjkwMDU4YTRkNzliNjQxMjMwYzIyZjhiMjUwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzlmZTFjOGVkMmZiZjQ0ZjJiYTA2MmNmYzVjNjgxZmNkID0gJCgnPGRpdiBpZD0iaHRtbF85ZmUxYzhlZDJmYmY0NGYyYmEwNjJjZmM1YzY4MWZjZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VmljdG9yaWEgVmlsbGFnZSwgTm9ydGggWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTc4YWFiOTAwNThhNGQ3OWI2NDEyMzBjMjJmOGIyNTAuc2V0Q29udGVudChodG1sXzlmZTFjOGVkMmZiZjQ0ZjJiYTA2MmNmYzVjNjgxZmNkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzNhZWFjOWY1OGQ5MTQyOTA4ZTQ3MTg2MDYyNzU3YjI4LmJpbmRQb3B1cChwb3B1cF9hNzhhYWI5MDA1OGE0ZDc5YjY0MTIzMGMyMmY4YjI1MCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wZTY2OWQ2NDgxMGE0N2VmYTdkZjQwMGE5ZTAzNGZhZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY1NDI1OTksLTc5LjM2MDYzNTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGQ4MzBlZTY3MWZkNDAxZmIzMDE3YmFhN2JkYjA3NmMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTM4MjYwZjhmZmUxNDIxYTkxNmQ5MmVkODNhNzhiZWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDQ4OWQxMzEwOWI2NDQ4NWExZTE2ODZiOTZkN2U3MGYgPSAkKCc8ZGl2IGlkPSJodG1sXzA0ODlkMTMxMDliNjQ0ODVhMWUxNjg2Yjk2ZDdlNzBmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IYXJib3VyZnJvbnQsIFJlZ2VudCBQYXJrLCBEb3dudG93biBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85MzgyNjBmOGZmZTE0MjFhOTE2ZDkyZWQ4M2E3OGJlYS5zZXRDb250ZW50KGh0bWxfMDQ4OWQxMzEwOWI2NDQ4NWExZTE2ODZiOTZkN2U3MGYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMGU2NjlkNjQ4MTBhNDdlZmE3ZGY0MDBhOWUwMzRmYWQuYmluZFBvcHVwKHBvcHVwXzkzODI2MGY4ZmZlMTQyMWE5MTZkOTJlZDgzYTc4YmVhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzdjOWFlMGMzODdlNTRjOTliMzgwYTYyNThjZjhhYmQwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzE4NTE3OTk5OTk5OTk2LC03OS40NjQ3NjMyOTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kZDgzMGVlNjcxZmQ0MDFmYjMwMTdiYWE3YmRiMDc2Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zOThjMzE5ZGU3YzY0NmRmOWRmNDQwYWVlZjUwMTExYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kNzhiYmEzZDRiMGM0MWM2ODIwZmY0Y2I4MTVmODA0MSA9ICQoJzxkaXYgaWQ9Imh0bWxfZDc4YmJhM2Q0YjBjNDFjNjgyMGZmNGNiODE1ZjgwNDEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxhd3JlbmNlIEhlaWdodHMsIExhd3JlbmNlIE1hbm9yLCBOb3J0aCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zOThjMzE5ZGU3YzY0NmRmOWRmNDQwYWVlZjUwMTExYS5zZXRDb250ZW50KGh0bWxfZDc4YmJhM2Q0YjBjNDFjNjgyMGZmNGNiODE1ZjgwNDEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfN2M5YWUwYzM4N2U1NGM5OWIzODBhNjI1OGNmOGFiZDAuYmluZFBvcHVwKHBvcHVwXzM5OGMzMTlkZTdjNjQ2ZGY5ZGY0NDBhZWVmNTAxMTFhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzIxN2Y5N2NjNjczMTRjYTI5Y2MzMDVhM2M3MDRkZTVhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjYyMzAxNSwtNzkuMzg5NDkzOF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kZDgzMGVlNjcxZmQ0MDFmYjMwMTdiYWE3YmRiMDc2Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xZDdhZDgzOTllZDI0NzVlODcyNjdlZGQyODJjMTIzOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80ZWEwODRmOTA0ZGI0NDAxYWNiOGI2N2RiODBiMjZlOSA9ICQoJzxkaXYgaWQ9Imh0bWxfNGVhMDg0ZjkwNGRiNDQwMWFjYjhiNjdkYjgwYjI2ZTkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlF1ZWVuJiMzOTtzIFBhcmssIFF1ZWVuJiMzOTtzIFBhcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzFkN2FkODM5OWVkMjQ3NWU4NzI2N2VkZDI4MmMxMjM4LnNldENvbnRlbnQoaHRtbF80ZWEwODRmOTA0ZGI0NDAxYWNiOGI2N2RiODBiMjZlOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yMTdmOTdjYzY3MzE0Y2EyOWNjMzA1YTNjNzA0ZGU1YS5iaW5kUG9wdXAocG9wdXBfMWQ3YWQ4Mzk5ZWQyNDc1ZTg3MjY3ZWRkMjgyYzEyMzgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZWIyYjEwM2VmNTk5NDY0ZmFjZWNiNmU1ODRmM2FjNDQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42Njc4NTU2LC03OS41MzIyNDI0MDAwMDAwMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kZDgzMGVlNjcxZmQ0MDFmYjMwMTdiYWE3YmRiMDc2Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85MmJkMWJmN2RjMjM0NjgxOTBlZGU0N2RhZWZjODI1MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kMjVkNGUxNThkZjY0ZDZlYjY2MzhjYzkyNzM0YjczNSA9ICQoJzxkaXYgaWQ9Imh0bWxfZDI1ZDRlMTU4ZGY2NGQ2ZWI2NjM4Y2M5MjczNGI3MzUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPklzbGluZ3RvbiBBdmVudWUsIEV0b2JpY29rZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTJiZDFiZjdkYzIzNDY4MTkwZWRlNDdkYWVmYzgyNTIuc2V0Q29udGVudChodG1sX2QyNWQ0ZTE1OGRmNjRkNmViNjYzOGNjOTI3MzRiNzM1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ViMmIxMDNlZjU5OTQ2NGZhY2VjYjZlNTg0ZjNhYzQ0LmJpbmRQb3B1cChwb3B1cF85MmJkMWJmN2RjMjM0NjgxOTBlZGU0N2RhZWZjODI1Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xYjkwOWRmZTBkYWE0YmQ0YWI3YjFkOTI0Y2U0NWUyYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjgwNjY4NjI5OTk5OTk5NiwtNzkuMTk0MzUzNDAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGQ4MzBlZTY3MWZkNDAxZmIzMDE3YmFhN2JkYjA3NmMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTQ1M2YzNGQ2MjhiNDUwZDg2MjIyY2U0ZDE4OWRhZDEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWI4NTEzOWEwZDEyNDhiNWJjMjU2MmY5NTM0NzM3NTcgPSAkKCc8ZGl2IGlkPSJodG1sXzViODUxMzlhMGQxMjQ4YjViYzI1NjJmOTUzNDczNzU3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Sb3VnZSwgTWFsdmVybiwgU2NhcmJvcm91Z2g8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2U0NTNmMzRkNjI4YjQ1MGQ4NjIyMmNlNGQxODlkYWQxLnNldENvbnRlbnQoaHRtbF81Yjg1MTM5YTBkMTI0OGI1YmMyNTYyZjk1MzQ3Mzc1Nyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xYjkwOWRmZTBkYWE0YmQ0YWI3YjFkOTI0Y2U0NWUyYS5iaW5kUG9wdXAocG9wdXBfZTQ1M2YzNGQ2MjhiNDUwZDg2MjIyY2U0ZDE4OWRhZDEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWM4NTBjODczMWE2NDQyN2FjYzY5MzQ1NGY4NmUyMzAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43NDU5MDU3OTk5OTk5OTYsLTc5LjM1MjE4OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kZDgzMGVlNjcxZmQ0MDFmYjMwMTdiYWE3YmRiMDc2Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iOTk5YWZmMWUxNmY0ZGI2YjVkYTkwNzhhYTYyZTIzMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yNzM0ZTkzNTA1NmI0MTYwODAwOGE1MWM5ZGZmOTU5ZCA9ICQoJzxkaXYgaWQ9Imh0bWxfMjczNGU5MzUwNTZiNDE2MDgwMDhhNTFjOWRmZjk1OWQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRvbiBNaWxscyBOb3J0aCwgTm9ydGggWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjk5OWFmZjFlMTZmNGRiNmI1ZGE5MDc4YWE2MmUyMzAuc2V0Q29udGVudChodG1sXzI3MzRlOTM1MDU2YjQxNjA4MDA4YTUxYzlkZmY5NTlkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzFjODUwYzg3MzFhNjQ0MjdhY2M2OTM0NTRmODZlMjMwLmJpbmRQb3B1cChwb3B1cF9iOTk5YWZmMWUxNmY0ZGI2YjVkYTkwNzhhYTYyZTIzMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mZDMzMDUyYjMyYzg0N2M0OWFhZjk0YzliZWZhZmE4ZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcwNjM5NzIsLTc5LjMwOTkzN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kZDgzMGVlNjcxZmQ0MDFmYjMwMTdiYWE3YmRiMDc2Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jMzFlNjdiY2Y1M2U0NmUwOWIwZDI3NmFmMWMzYTFhNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hYmU0YTViYWNhMGQ0OTgwYTNiNjdkZWY1Y2VkNGU0OCA9ICQoJzxkaXYgaWQ9Imh0bWxfYWJlNGE1YmFjYTBkNDk4MGEzYjY3ZGVmNWNlZDRlNDgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldvb2RiaW5lIEdhcmRlbnMsIFBhcmt2aWV3IEhpbGwsIEVhc3QgWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzMxZTY3YmNmNTNlNDZlMDliMGQyNzZhZjFjM2ExYTcuc2V0Q29udGVudChodG1sX2FiZTRhNWJhY2EwZDQ5ODBhM2I2N2RlZjVjZWQ0ZTQ4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ZkMzMwNTJiMzJjODQ3YzQ5YWFmOTRjOWJlZmFmYThkLmJpbmRQb3B1cChwb3B1cF9jMzFlNjdiY2Y1M2U0NmUwOWIwZDI3NmFmMWMzYTFhNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xODAyZWM4NWQ4YzE0NjdkYjEzY2EyN2NlMzQyYTRjMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY1NzE2MTgsLTc5LjM3ODkzNzA5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RkODMwZWU2NzFmZDQwMWZiMzAxN2JhYTdiZGIwNzZjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzIxYWU0NDczMjBkYTRmYzFiOWNmNmM4ODQ5YzM0Y2U3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBlNmUxZTIzNjBiNTRjNDFiOWY5OGNmODM5NGUwMTJhID0gJCgnPGRpdiBpZD0iaHRtbF8wZTZlMWUyMzYwYjU0YzQxYjlmOThjZjgzOTRlMDEyYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UnllcnNvbiwgR2FyZGVuIERpc3RyaWN0LCBEb3dudG93biBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yMWFlNDQ3MzIwZGE0ZmMxYjljZjZjODg0OWMzNGNlNy5zZXRDb250ZW50KGh0bWxfMGU2ZTFlMjM2MGI1NGM0MWI5Zjk4Y2Y4Mzk0ZTAxMmEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTgwMmVjODVkOGMxNDY3ZGIxM2NhMjdjZTM0MmE0YzAuYmluZFBvcHVwKHBvcHVwXzIxYWU0NDczMjBkYTRmYzFiOWNmNmM4ODQ5YzM0Y2U3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2IwN2Y1Mzc0NGVlNzRhZDk4MTQ2Y2E3Y2JjNzI2NjBjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzA5NTc3LC03OS40NDUwNzI1OTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kZDgzMGVlNjcxZmQ0MDFmYjMwMTdiYWE3YmRiMDc2Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mMGM3ZjE5ZjQ1ZDk0NDNiODkwYWQ0MTk1OTZiMzYxNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wNDI0NTU2ZjU0YTE0OTliYTFkYzViMGIzOTVjMjQ3YyA9ICQoJzxkaXYgaWQ9Imh0bWxfMDQyNDU1NmY1NGExNDk5YmExZGM1YjBiMzk1YzI0N2MiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkdsZW5jYWlybiwgTm9ydGggWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjBjN2YxOWY0NWQ5NDQzYjg5MGFkNDE5NTk2YjM2MTQuc2V0Q29udGVudChodG1sXzA0MjQ1NTZmNTRhMTQ5OWJhMWRjNWIwYjM5NWMyNDdjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2IwN2Y1Mzc0NGVlNzRhZDk4MTQ2Y2E3Y2JjNzI2NjBjLmJpbmRQb3B1cChwb3B1cF9mMGM3ZjE5ZjQ1ZDk0NDNiODkwYWQ0MTk1OTZiMzYxNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82NDg3MjM1ZGQzODI0MmM2YWM1YTI5Y2I5MzQ0ODI0NiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY1MDk0MzIsLTc5LjU1NDcyNDQwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RkODMwZWU2NzFmZDQwMWZiMzAxN2JhYTdiZGIwNzZjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhiMGQ5MDFjNzMxZTRkMzRhMWM5NTAyOTlmZDcyMTFlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFjYzdmNGZhYjAwYTQxY2Q5ZGZhOWFiYjZiMWUyOWZlID0gJCgnPGRpdiBpZD0iaHRtbF8xY2M3ZjRmYWIwMGE0MWNkOWRmYTlhYmI2YjFlMjlmZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2xvdmVyZGFsZSwgSXNsaW5ndG9uLCBNYXJ0aW4gR3JvdmUsIFByaW5jZXNzIEdhcmRlbnMsIFdlc3QgRGVhbmUgUGFyaywgRXRvYmljb2tlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84YjBkOTAxYzczMWU0ZDM0YTFjOTUwMjk5ZmQ3MjExZS5zZXRDb250ZW50KGh0bWxfMWNjN2Y0ZmFiMDBhNDFjZDlkZmE5YWJiNmIxZTI5ZmUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjQ4NzIzNWRkMzgyNDJjNmFjNWEyOWNiOTM0NDgyNDYuYmluZFBvcHVwKHBvcHVwXzhiMGQ5MDFjNzMxZTRkMzRhMWM5NTAyOTlmZDcyMTFlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2VkMGFjNDIwM2ZhZTQ4MjY5MjQzMzk5ZGRiNDI5MTE5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzg0NTM1MSwtNzkuMTYwNDk3MDk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGQ4MzBlZTY3MWZkNDAxZmIzMDE3YmFhN2JkYjA3NmMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzUyNWE3MDk0YjUzNGViMjgyMzZjYWQwODJhMmFhMjkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTUzNDljNjdiZGZiNDkyMWI2MmEzMDc3ZjgwMzlmZDMgPSAkKCc8ZGl2IGlkPSJodG1sX2E1MzQ5YzY3YmRmYjQ5MjFiNjJhMzA3N2Y4MDM5ZmQzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IaWdobGFuZCBDcmVlaywgUm91Z2UgSGlsbCwgUG9ydCBVbmlvbiwgU2NhcmJvcm91Z2g8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2M1MjVhNzA5NGI1MzRlYjI4MjM2Y2FkMDgyYTJhYTI5LnNldENvbnRlbnQoaHRtbF9hNTM0OWM2N2JkZmI0OTIxYjYyYTMwNzdmODAzOWZkMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lZDBhYzQyMDNmYWU0ODI2OTI0MzM5OWRkYjQyOTExOS5iaW5kUG9wdXAocG9wdXBfYzUyNWE3MDk0YjUzNGViMjgyMzZjYWQwODJhMmFhMjkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTA5ZDNhMzcwNGI3NDIyYmJmOTk5YTQ4NDdlMDVjYTEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MjU4OTk3MDAwMDAwMSwtNzkuMzQwOTIzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RkODMwZWU2NzFmZDQwMWZiMzAxN2JhYTdiZGIwNzZjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E4MDMyNDhhNTE5ODQ1ZmE5Y2FlODk5NzNkNGQ4ZDFkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFmMDQ4Mzk4YTM4YzQzMDU5MjkxM2MzOWViOWEyM2YzID0gJCgnPGRpdiBpZD0iaHRtbF8xZjA0ODM5OGEzOGM0MzA1OTI5MTNjMzllYjlhMjNmMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RmxlbWluZ2RvbiBQYXJrLCBEb24gTWlsbHMgU291dGgsIE5vcnRoIFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E4MDMyNDhhNTE5ODQ1ZmE5Y2FlODk5NzNkNGQ4ZDFkLnNldENvbnRlbnQoaHRtbF8xZjA0ODM5OGEzOGM0MzA1OTI5MTNjMzllYjlhMjNmMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hMDlkM2EzNzA0Yjc0MjJiYmY5OTlhNDg0N2UwNWNhMS5iaW5kUG9wdXAocG9wdXBfYTgwMzI0OGE1MTk4NDVmYTljYWU4OTk3M2Q0ZDhkMWQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTcxZDg3MDk2M2FiNDA0Y2FjODUxZDI4ZjZjNzU2NDkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42OTUzNDM5MDAwMDAwMDUsLTc5LjMxODM4ODddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGQ4MzBlZTY3MWZkNDAxZmIzMDE3YmFhN2JkYjA3NmMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZWQ2MGZkMGUwNTZmNDU2YjllZTQ4MDc2ODcwYmM5MTkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjVlNDA4ODFhYTBjNDM2OGI5N2VhMzk4NzQxOTEzZWUgPSAkKCc8ZGl2IGlkPSJodG1sXzI1ZTQwODgxYWEwYzQzNjhiOTdlYTM5ODc0MTkxM2VlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Xb29kYmluZSBIZWlnaHRzLCBFYXN0IFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2VkNjBmZDBlMDU2ZjQ1NmI5ZWU0ODA3Njg3MGJjOTE5LnNldENvbnRlbnQoaHRtbF8yNWU0MDg4MWFhMGM0MzY4Yjk3ZWEzOTg3NDE5MTNlZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85NzFkODcwOTYzYWI0MDRjYWM4NTFkMjhmNmM3NTY0OS5iaW5kUG9wdXAocG9wdXBfZWQ2MGZkMGUwNTZmNDU2YjllZTQ4MDc2ODcwYmM5MTkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjQ3OTBiMWQxMWEwNDE2ZWIzNTMxYTk4MzZlMDUzOTYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NTE0OTM5LC03OS4zNzU0MTc5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RkODMwZWU2NzFmZDQwMWZiMzAxN2JhYTdiZGIwNzZjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q1YzQ0OTI2MGU0MzRhYTc4NTNlZjJkZDM4ZDNkNjUwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q3ZmFlNzYwYzNiOTRmODI4ZTQxM2UwN2JlMWM5OGQ1ID0gJCgnPGRpdiBpZD0iaHRtbF9kN2ZhZTc2MGMzYjk0ZjgyOGU0MTNlMDdiZTFjOThkNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3QuIEphbWVzIFRvd24sIERvd250b3duIFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q1YzQ0OTI2MGU0MzRhYTc4NTNlZjJkZDM4ZDNkNjUwLnNldENvbnRlbnQoaHRtbF9kN2ZhZTc2MGMzYjk0ZjgyOGU0MTNlMDdiZTFjOThkNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mNDc5MGIxZDExYTA0MTZlYjM1MzFhOTgzNmUwNTM5Ni5iaW5kUG9wdXAocG9wdXBfZDVjNDQ5MjYwZTQzNGFhNzg1M2VmMmRkMzhkM2Q2NTApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDYyMWNmYWM4YTFjNDU2YjlmZWVlY2VhZjQ1NDk5NmEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42OTM3ODEzLC03OS40MjgxOTE0MDAwMDAwMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kZDgzMGVlNjcxZmQ0MDFmYjMwMTdiYWE3YmRiMDc2Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83MWM3MjJkN2Q4YWI0ZWVlOTE2MDVkODU2NmI1ZTIzZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80OWIxMTU3YWE0OWI0ZmI1YmRjMjQzNDIwZTg2OWNkNyA9ICQoJzxkaXYgaWQ9Imh0bWxfNDliMTE1N2FhNDliNGZiNWJkYzI0MzQyMGU4NjljZDciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkh1bWV3b29kLUNlZGFydmFsZSwgWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzFjNzIyZDdkOGFiNGVlZTkxNjA1ZDg1NjZiNWUyM2Yuc2V0Q29udGVudChodG1sXzQ5YjExNTdhYTQ5YjRmYjViZGMyNDM0MjBlODY5Y2Q3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Q2MjFjZmFjOGExYzQ1NmI5ZmVlZWNlYWY0NTQ5OTZhLmJpbmRQb3B1cChwb3B1cF83MWM3MjJkN2Q4YWI0ZWVlOTE2MDVkODU2NmI1ZTIzZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84NTM5NGQ1OTA5N2E0NDYzYTVlYjI2OGJmNjcwZmYzYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY0MzUxNTIsLTc5LjU3NzIwMDc5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RkODMwZWU2NzFmZDQwMWZiMzAxN2JhYTdiZGIwNzZjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzcyODFiZGI0YjNhYTQyMzFiMTZjNzllZWRjYWM3ZGI2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzkwNmE1MGI3MWM1YjQxYmVhYjg2MDE4YmQxNGZmYzFmID0gJCgnPGRpdiBpZD0iaHRtbF85MDZhNTBiNzFjNWI0MWJlYWI4NjAxOGJkMTRmZmMxZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Qmxvb3JkYWxlIEdhcmRlbnMsIEVyaW5nYXRlLCBNYXJrbGFuZCBXb29kLCBPbGQgQnVybmhhbXRob3JwZSwgRXRvYmljb2tlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83MjgxYmRiNGIzYWE0MjMxYjE2Yzc5ZWVkY2FjN2RiNi5zZXRDb250ZW50KGh0bWxfOTA2YTUwYjcxYzViNDFiZWFiODYwMThiZDE0ZmZjMWYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODUzOTRkNTkwOTdhNDQ2M2E1ZWIyNjhiZjY3MGZmM2EuYmluZFBvcHVwKHBvcHVwXzcyODFiZGI0YjNhYTQyMzFiMTZjNzllZWRjYWM3ZGI2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2MwMDVkMTRiYmEwYzQxMzRiNjcwZjQ5YTY2Njc4YmQ2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzYzNTcyNiwtNzkuMTg4NzExNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kZDgzMGVlNjcxZmQ0MDFmYjMwMTdiYWE3YmRiMDc2Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80YWVhZmQwNWUwMjM0ZjU3YjIxYjE0ZTM3ODhlZGIwOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mYjIzODY0OTgxOTk0YWJhYjA4NTk4YzExMDdkMjExYiA9ICQoJzxkaXYgaWQ9Imh0bWxfZmIyMzg2NDk4MTk5NGFiYWIwODU5OGMxMTA3ZDIxMWIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkd1aWxkd29vZCwgTW9ybmluZ3NpZGUsIFdlc3QgSGlsbCwgU2NhcmJvcm91Z2g8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzRhZWFmZDA1ZTAyMzRmNTdiMjFiMTRlMzc4OGVkYjA4LnNldENvbnRlbnQoaHRtbF9mYjIzODY0OTgxOTk0YWJhYjA4NTk4YzExMDdkMjExYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jMDA1ZDE0YmJhMGM0MTM0YjY3MGY0OWE2NjY3OGJkNi5iaW5kUG9wdXAocG9wdXBfNGFlYWZkMDVlMDIzNGY1N2IyMWIxNGUzNzg4ZWRiMDgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzE0NGZiZDkyZWM3NDFmZWIyN2FkZTYzNjE0YmQ1MzQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NzYzNTczOTk5OTk5OSwtNzkuMjkzMDMxMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kZDgzMGVlNjcxZmQ0MDFmYjMwMTdiYWE3YmRiMDc2Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84NjgxNTI5YmZlZmM0NjUzYjcwODMwZDlmYjRhMzQ5NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iYWFiODQ1M2U1ZWY0ZmU4OGQxYzgzYzcyZDdjY2YxYSA9ICQoJzxkaXYgaWQ9Imh0bWxfYmFhYjg0NTNlNWVmNGZlODhkMWM4M2M3MmQ3Y2NmMWEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlRoZSBCZWFjaGVzLCBFYXN0IFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg2ODE1MjliZmVmYzQ2NTNiNzA4MzBkOWZiNGEzNDk3LnNldENvbnRlbnQoaHRtbF9iYWFiODQ1M2U1ZWY0ZmU4OGQxYzgzYzcyZDdjY2YxYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83MTQ0ZmJkOTJlYzc0MWZlYjI3YWRlNjM2MTRiZDUzNC5iaW5kUG9wdXAocG9wdXBfODY4MTUyOWJmZWZjNDY1M2I3MDgzMGQ5ZmI0YTM0OTcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZWI3YTQzNjdmNWYzNGVjMGFjODg5NzVjZTcxNmM2MzAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NDQ3NzA3OTk5OTk5OTYsLTc5LjM3MzMwNjRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGQ4MzBlZTY3MWZkNDAxZmIzMDE3YmFhN2JkYjA3NmMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjY2YWUzMzUxYmU0NGJiMjk2ZTRmZGZmNmM3N2VmZWMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDUxY2NiZWM1OTRjNGE2NDhkMmM3ZTc0YjdmYjFhODMgPSAkKCc8ZGl2IGlkPSJodG1sXzA1MWNjYmVjNTk0YzRhNjQ4ZDJjN2U3NGI3ZmIxYTgzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CZXJjenkgUGFyaywgRG93bnRvd24gVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjY2YWUzMzUxYmU0NGJiMjk2ZTRmZGZmNmM3N2VmZWMuc2V0Q29udGVudChodG1sXzA1MWNjYmVjNTk0YzRhNjQ4ZDJjN2U3NGI3ZmIxYTgzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ViN2E0MzY3ZjVmMzRlYzBhYzg4OTc1Y2U3MTZjNjMwLmJpbmRQb3B1cChwb3B1cF9mNjZhZTMzNTFiZTQ0YmIyOTZlNGZkZmY2Yzc3ZWZlYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hODEwMWUzMDkyMTg0MTE3OGQwZDQ4OWQ3N2VjZjk1NiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY4OTAyNTYsLTc5LjQ1MzUxMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kZDgzMGVlNjcxZmQ0MDFmYjMwMTdiYWE3YmRiMDc2Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xZmZkYTUyNDAzZjc0NTM3YTQ0MDRjZjRlMDhkZTEzZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80YjNmYzNjN2Y3YmI0ZTJjYWIxNDk3ZTNmNDBhODlhNSA9ICQoJzxkaXYgaWQ9Imh0bWxfNGIzZmMzYzdmN2JiNGUyY2FiMTQ5N2UzZjQwYTg5YTUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNhbGVkb25pYS1GYWlyYmFua3MsIFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzFmZmRhNTI0MDNmNzQ1MzdhNDQwNGNmNGUwOGRlMTNmLnNldENvbnRlbnQoaHRtbF80YjNmYzNjN2Y3YmI0ZTJjYWIxNDk3ZTNmNDBhODlhNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hODEwMWUzMDkyMTg0MTE3OGQwZDQ4OWQ3N2VjZjk1Ni5iaW5kUG9wdXAocG9wdXBfMWZmZGE1MjQwM2Y3NDUzN2E0NDA0Y2Y0ZTA4ZGUxM2YpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTE0YWRmYTEzNzlmNDgzMWFiNGJjMGUzN2Y2NTg1MTIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43NzA5OTIxLC03OS4yMTY5MTc0MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kZDgzMGVlNjcxZmQ0MDFmYjMwMTdiYWE3YmRiMDc2Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jZTY2OWE0M2RmYzE0MTBhOWYwMGFjYmUxYTE1MTdkZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82YmFiM2Q2MDE4MWQ0MDA1OWY5YzZkMzM2MTJiOTdjMSA9ICQoJzxkaXYgaWQ9Imh0bWxfNmJhYjNkNjAxODFkNDAwNTlmOWM2ZDMzNjEyYjk3YzEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldvYnVybiwgU2NhcmJvcm91Z2g8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2NlNjY5YTQzZGZjMTQxMGE5ZjAwYWNiZTFhMTUxN2RkLnNldENvbnRlbnQoaHRtbF82YmFiM2Q2MDE4MWQ0MDA1OWY5YzZkMzM2MTJiOTdjMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hMTRhZGZhMTM3OWY0ODMxYWI0YmMwZTM3ZjY1ODUxMi5iaW5kUG9wdXAocG9wdXBfY2U2NjlhNDNkZmMxNDEwYTlmMDBhY2JlMWExNTE3ZGQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYWI0MTJkNzVkZDY3NGI4OWIzYjcwMWJlZDVhNjgzOWYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MDkwNjA0LC03OS4zNjM0NTE3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RkODMwZWU2NzFmZDQwMWZiMzAxN2JhYTdiZGIwNzZjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdiZTMxNGM4Y2FmNzQ5YWNiZGIxYzllYWYzMzI0ZWQ1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzA1MTAzMWRiMDc0MjQ3ZTdhMzdkMWNhYzdkMjNhMmFiID0gJCgnPGRpdiBpZD0iaHRtbF8wNTEwMzFkYjA3NDI0N2U3YTM3ZDFjYWM3ZDIzYTJhYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGVhc2lkZSwgRWFzdCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83YmUzMTRjOGNhZjc0OWFjYmRiMWM5ZWFmMzMyNGVkNS5zZXRDb250ZW50KGh0bWxfMDUxMDMxZGIwNzQyNDdlN2EzN2QxY2FjN2QyM2EyYWIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYWI0MTJkNzVkZDY3NGI4OWIzYjcwMWJlZDVhNjgzOWYuYmluZFBvcHVwKHBvcHVwXzdiZTMxNGM4Y2FmNzQ5YWNiZGIxYzllYWYzMzI0ZWQ1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzMwMjIxODdjZTkxNzRmZDk4MmVlMmJjYjgxZTU0ZjM2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjU3OTUyNCwtNzkuMzg3MzgyNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kZDgzMGVlNjcxZmQ0MDFmYjMwMTdiYWE3YmRiMDc2Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iZjQyOTczNzliYTA0YzliOGY5MzVjMzhlMmRjODNmYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82MzM1YTIxZjUyNzU0MWM0ODA3MTRhNDdlM2I3YmQ2NyA9ICQoJzxkaXYgaWQ9Imh0bWxfNjMzNWEyMWY1Mjc1NDFjNDgwNzE0YTQ3ZTNiN2JkNjciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNlbnRyYWwgQmF5IFN0cmVldCwgRG93bnRvd24gVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYmY0Mjk3Mzc5YmEwNGM5YjhmOTM1YzM4ZTJkYzgzZmEuc2V0Q29udGVudChodG1sXzYzMzVhMjFmNTI3NTQxYzQ4MDcxNGE0N2UzYjdiZDY3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzMwMjIxODdjZTkxNzRmZDk4MmVlMmJjYjgxZTU0ZjM2LmJpbmRQb3B1cChwb3B1cF9iZjQyOTczNzliYTA0YzliOGY5MzVjMzhlMmRjODNmYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81N2QxYzljMmM4OGM0OGQwOTMyNTRlNjE3NTdkNGI2NCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY2OTU0MiwtNzkuNDIyNTYzN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kZDgzMGVlNjcxZmQ0MDFmYjMwMTdiYWE3YmRiMDc2Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yMjhiZDQ0NTc4NGU0MjE0YmQ4ZDlhY2I4YTcwM2QxMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84MTc2ZGFlYzYwY2I0OTQ4ODFhNjcxNmY0ZmRkNDUxZSA9ICQoJzxkaXYgaWQ9Imh0bWxfODE3NmRhZWM2MGNiNDk0ODgxYTY3MTZmNGZkZDQ1MWUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNocmlzdGllLCBEb3dudG93biBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yMjhiZDQ0NTc4NGU0MjE0YmQ4ZDlhY2I4YTcwM2QxMS5zZXRDb250ZW50KGh0bWxfODE3NmRhZWM2MGNiNDk0ODgxYTY3MTZmNGZkZDQ1MWUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTdkMWM5YzJjODhjNDhkMDkzMjU0ZTYxNzU3ZDRiNjQuYmluZFBvcHVwKHBvcHVwXzIyOGJkNDQ1Nzg0ZTQyMTRiZDhkOWFjYjhhNzAzZDExKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzYyZDViZTkzNzQ5ODQ5Mjc5ZDA5ODIwZTVhYTRlMDJhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzczMTM2LC03OS4yMzk0NzYwOTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kZDgzMGVlNjcxZmQ0MDFmYjMwMTdiYWE3YmRiMDc2Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84NzE2ZTQ4NTMwYWQ0ZTFmYWJhODk3Yjg3NWE0MjQxOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mMTM4ZjM5MzgwNzY0ZjVmODQ5OTY2NmFlMWNmMmQ3MiA9ICQoJzxkaXYgaWQ9Imh0bWxfZjEzOGYzOTM4MDc2NGY1Zjg0OTk2NjZhZTFjZjJkNzIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNlZGFyYnJhZSwgU2NhcmJvcm91Z2g8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg3MTZlNDg1MzBhZDRlMWZhYmE4OTdiODc1YTQyNDE4LnNldENvbnRlbnQoaHRtbF9mMTM4ZjM5MzgwNzY0ZjVmODQ5OTY2NmFlMWNmMmQ3Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82MmQ1YmU5Mzc0OTg0OTI3OWQwOTgyMGU1YWE0ZTAyYS5iaW5kUG9wdXAocG9wdXBfODcxNmU0ODUzMGFkNGUxZmFiYTg5N2I4NzVhNDI0MTgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWI2MjlmZmQyZTFjNDFhYWEzZjMwOWE4Y2Y3NWE1M2IgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My44MDM3NjIyLC03OS4zNjM0NTE3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RkODMwZWU2NzFmZDQwMWZiMzAxN2JhYTdiZGIwNzZjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2I4NTNhMTgzMjExZjQ2MWY5OWJjM2UzY2NiZWY5NTc3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2UzMTk0MTI1YzliMjRhOTc4MzA4MTdjZGE1NTZiMjc3ID0gJCgnPGRpdiBpZD0iaHRtbF9lMzE5NDEyNWM5YjI0YTk3ODMwODE3Y2RhNTU2YjI3NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SGlsbGNyZXN0IFZpbGxhZ2UsIE5vcnRoIFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I4NTNhMTgzMjExZjQ2MWY5OWJjM2UzY2NiZWY5NTc3LnNldENvbnRlbnQoaHRtbF9lMzE5NDEyNWM5YjI0YTk3ODMwODE3Y2RhNTU2YjI3Nyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xYjYyOWZmZDJlMWM0MWFhYTNmMzA5YThjZjc1YTUzYi5iaW5kUG9wdXAocG9wdXBfYjg1M2ExODMyMTFmNDYxZjk5YmMzZTNjY2JlZjk1NzcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjc0YzIwNWQzM2MxNDM1YWE4Y2UwNzRmMWYxNzcxMjUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43NTQzMjgzLC03OS40NDIyNTkzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RkODMwZWU2NzFmZDQwMWZiMzAxN2JhYTdiZGIwNzZjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzJhMWIwNGZkOGVkYTQ0MWY5MmI5ZDMxYTBlMzVkZGU3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRjOTcwM2UzOGU0YzQ2MGE4YzY0YTJkZjc3ZmJiODE1ID0gJCgnPGRpdiBpZD0iaHRtbF80Yzk3MDNlMzhlNGM0NjBhOGM2NGEyZGY3N2ZiYjgxNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmF0aHVyc3QgTWFub3IsIERvd25zdmlldyBOb3J0aCwgV2lsc29uIEhlaWdodHMsIE5vcnRoIFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzJhMWIwNGZkOGVkYTQ0MWY5MmI5ZDMxYTBlMzVkZGU3LnNldENvbnRlbnQoaHRtbF80Yzk3MDNlMzhlNGM0NjBhOGM2NGEyZGY3N2ZiYjgxNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yNzRjMjA1ZDMzYzE0MzVhYThjZTA3NGYxZjE3NzEyNS5iaW5kUG9wdXAocG9wdXBfMmExYjA0ZmQ4ZWRhNDQxZjkyYjlkMzFhMGUzNWRkZTcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDdlMTA1NThiNzg4NDUwMGE5M2EwNDhlMDljMjNjY2EgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MDUzNjg5LC03OS4zNDkzNzE5MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kZDgzMGVlNjcxZmQ0MDFmYjMwMTdiYWE3YmRiMDc2Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xMDFiODgyMTI2ZTU0YTY0OGI1YzUyYzM0YmJlZTkzNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83ZDE3NWU5OTBhYmU0ZmE4OTk0N2NhOGQyOTI1OWQ3NSA9ICQoJzxkaXYgaWQ9Imh0bWxfN2QxNzVlOTkwYWJlNGZhODk5NDdjYThkMjkyNTlkNzUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlRob3JuY2xpZmZlIFBhcmssIEVhc3QgWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTAxYjg4MjEyNmU1NGE2NDhiNWM1MmMzNGJiZWU5MzUuc2V0Q29udGVudChodG1sXzdkMTc1ZTk5MGFiZTRmYTg5OTQ3Y2E4ZDI5MjU5ZDc1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQ3ZTEwNTU4Yjc4ODQ1MDBhOTNhMDQ4ZTA5YzIzY2NhLmJpbmRQb3B1cChwb3B1cF8xMDFiODgyMTI2ZTU0YTY0OGI1YzUyYzM0YmJlZTkzNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yMjhiZDczZDIyZTg0ZTYwOWQ5NWJlYzU1NDM5YWM4NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY1MDU3MTIwMDAwMDAxLC03OS4zODQ1Njc1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RkODMwZWU2NzFmZDQwMWZiMzAxN2JhYTdiZGIwNzZjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ZiZmE3YWExNDIxNjQ0MzdhNWI4MjI2ZmJkMjNhYTEwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2UzYzllZmMwOGFhOTQyZWM4ZjQ5ZDg1ZWRiMWYzMjU5ID0gJCgnPGRpdiBpZD0iaHRtbF9lM2M5ZWZjMDhhYTk0MmVjOGY0OWQ4NWVkYjFmMzI1OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QWRlbGFpZGUsIEtpbmcsIFJpY2htb25kLCBEb3dudG93biBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mYmZhN2FhMTQyMTY0NDM3YTViODIyNmZiZDIzYWExMC5zZXRDb250ZW50KGh0bWxfZTNjOWVmYzA4YWE5NDJlYzhmNDlkODVlZGIxZjMyNTkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjI4YmQ3M2QyMmU4NGU2MDlkOTViZWM1NTQzOWFjODUuYmluZFBvcHVwKHBvcHVwX2ZiZmE3YWExNDIxNjQ0MzdhNWI4MjI2ZmJkMjNhYTEwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzY1MzdlOWFjZjQ0ODRiZGNhYjViYWI3ZjgzMmJlOWZlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjY5MDA1MTAwMDAwMDEsLTc5LjQ0MjI1OTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGQ4MzBlZTY3MWZkNDAxZmIzMDE3YmFhN2JkYjA3NmMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjI3ZjZiZjM0MTZlNDY1MGIwN2Y4NmI4MmZlNWM0MTQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGM0NTQ0ZTAxN2NkNGZjMzgxN2UxNTRlNWQ5YjJiMTYgPSAkKCc8ZGl2IGlkPSJodG1sXzBjNDU0NGUwMTdjZDRmYzM4MTdlMTU0ZTVkOWIyYjE2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Eb3ZlcmNvdXJ0IFZpbGxhZ2UsIER1ZmZlcmluLCBXZXN0IFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzYyN2Y2YmYzNDE2ZTQ2NTBiMDdmODZiODJmZTVjNDE0LnNldENvbnRlbnQoaHRtbF8wYzQ1NDRlMDE3Y2Q0ZmMzODE3ZTE1NGU1ZDliMmIxNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82NTM3ZTlhY2Y0NDg0YmRjYWI1YmFiN2Y4MzJiZTlmZS5iaW5kUG9wdXAocG9wdXBfNjI3ZjZiZjM0MTZlNDY1MGIwN2Y4NmI4MmZlNWM0MTQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmJhNDZlMDBlMjcxNDMyOGIwYmExM2I5YWM2ZTI0YTMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43NDQ3MzQyLC03OS4yMzk0NzYwOTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kZDgzMGVlNjcxZmQ0MDFmYjMwMTdiYWE3YmRiMDc2Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85NTc4N2JlZDQ0NjI0ODM1YTlhMjc1NjcwOGVhMjZmMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82NTVmMDk2NzEwN2Q0ZjIzODUwMGMxOGQ4MTlhMmY4ZCA9ICQoJzxkaXYgaWQ9Imh0bWxfNjU1ZjA5NjcxMDdkNGYyMzg1MDBjMThkODE5YTJmOGQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNjYXJib3JvdWdoIFZpbGxhZ2UsIFNjYXJib3JvdWdoPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85NTc4N2JlZDQ0NjI0ODM1YTlhMjc1NjcwOGVhMjZmMi5zZXRDb250ZW50KGh0bWxfNjU1ZjA5NjcxMDdkNGYyMzg1MDBjMThkODE5YTJmOGQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNmJhNDZlMDBlMjcxNDMyOGIwYmExM2I5YWM2ZTI0YTMuYmluZFBvcHVwKHBvcHVwXzk1Nzg3YmVkNDQ2MjQ4MzVhOWEyNzU2NzA4ZWEyNmYyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzMzMjFmYzNjMjIxYzQyMjQ5OTRhZjdkOWIwY2EyODg0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzc4NTE3NSwtNzkuMzQ2NTU1N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kZDgzMGVlNjcxZmQ0MDFmYjMwMTdiYWE3YmRiMDc2Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kMjY5ZTFmNjcyNjA0NjcxYWRhZTlmN2RlZDMyNTkyYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yNmRhZWExNjM0Y2Q0ZDYzOGZlYWJlNGQyMTQ2NDdmNCA9ICQoJzxkaXYgaWQ9Imh0bWxfMjZkYWVhMTYzNGNkNGQ2MzhmZWFiZTRkMjE0NjQ3ZjQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZhaXJ2aWV3LCBIZW5yeSBGYXJtLCBPcmlvbGUsIE5vcnRoIFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2QyNjllMWY2NzI2MDQ2NzFhZGFlOWY3ZGVkMzI1OTJhLnNldENvbnRlbnQoaHRtbF8yNmRhZWExNjM0Y2Q0ZDYzOGZlYWJlNGQyMTQ2NDdmNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zMzIxZmMzYzIyMWM0MjI0OTk0YWY3ZDliMGNhMjg4NC5iaW5kUG9wdXAocG9wdXBfZDI2OWUxZjY3MjYwNDY3MWFkYWU5ZjdkZWQzMjU5MmEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTEwYjg1NTdjNGFiNDM0NWFhZDlhZjZjZDVmYzU0NmEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43Njc5ODAzLC03OS40ODcyNjE5MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kZDgzMGVlNjcxZmQ0MDFmYjMwMTdiYWE3YmRiMDc2Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jNDdhYmU1ZDY5NjU0YzM1YTM3MDc3MWY0MTRkYjNkOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mMGVhYjkzMTgyZGI0NDkzODMxYmJhNDNiNWY5ZmEzYiA9ICQoJzxkaXYgaWQ9Imh0bWxfZjBlYWI5MzE4MmRiNDQ5MzgzMWJiYTQzYjVmOWZhM2IiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5vcnRod29vZCBQYXJrLCBZb3JrIFVuaXZlcnNpdHksIE5vcnRoIFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2M0N2FiZTVkNjk2NTRjMzVhMzcwNzcxZjQxNGRiM2Q5LnNldENvbnRlbnQoaHRtbF9mMGVhYjkzMTgyZGI0NDkzODMxYmJhNDNiNWY5ZmEzYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hMTBiODU1N2M0YWI0MzQ1YWFkOWFmNmNkNWZjNTQ2YS5iaW5kUG9wdXAocG9wdXBfYzQ3YWJlNWQ2OTY1NGMzNWEzNzA3NzFmNDE0ZGIzZDkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWFmNWQ3Y2YyZmE1NDFjMGEyM2RhOGJiNWNkZDY3ZGQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42ODUzNDcsLTc5LjMzODEwNjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGQ4MzBlZTY3MWZkNDAxZmIzMDE3YmFhN2JkYjA3NmMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTE3YTlhZTEzOWY0NDMyMjgyNmYxMzQ1NzhhZmQ5YjAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDBiNzQxZGYyYTQyNDQ4ZThmMTdmNzk3NmUzMDBmYTAgPSAkKCc8ZGl2IGlkPSJodG1sXzAwYjc0MWRmMmE0MjQ0OGU4ZjE3Zjc5NzZlMzAwZmEwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FYXN0IFRvcm9udG8sIEVhc3QgWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTE3YTlhZTEzOWY0NDMyMjgyNmYxMzQ1NzhhZmQ5YjAuc2V0Q29udGVudChodG1sXzAwYjc0MWRmMmE0MjQ0OGU4ZjE3Zjc5NzZlMzAwZmEwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzFhZjVkN2NmMmZhNTQxYzBhMjNkYThiYjVjZGQ2N2RkLmJpbmRQb3B1cChwb3B1cF8xMTdhOWFlMTM5ZjQ0MzIyODI2ZjEzNDU3OGFmZDliMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84OGQzYzU3YWMzNjA0MjUxYTdhMWY3ZTA3YmUzZDc4MCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY0MDgxNTcsLTc5LjM4MTc1MjI5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RkODMwZWU2NzFmZDQwMWZiMzAxN2JhYTdiZGIwNzZjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzJhNjBhODNkYjVhMTQ5YjE5M2I1MDVjN2E1MjdmZDc1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q2MWVjMzQ4ZWJmZTQ5ZWM5MzQxNTMwNDg3MzQ2NjhiID0gJCgnPGRpdiBpZD0iaHRtbF9kNjFlYzM0OGViZmU0OWVjOTM0MTUzMDQ4NzM0NjY4YiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SGFyYm91cmZyb250IEVhc3QsIFRvcm9udG8gSXNsYW5kcywgVW5pb24gU3RhdGlvbiwgRG93bnRvd24gVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMmE2MGE4M2RiNWExNDliMTkzYjUwNWM3YTUyN2ZkNzUuc2V0Q29udGVudChodG1sX2Q2MWVjMzQ4ZWJmZTQ5ZWM5MzQxNTMwNDg3MzQ2NjhiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzg4ZDNjNTdhYzM2MDQyNTFhN2ExZjdlMDdiZTNkNzgwLmJpbmRQb3B1cChwb3B1cF8yYTYwYTgzZGI1YTE0OWIxOTNiNTA1YzdhNTI3ZmQ3NSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wM2Y2OTg2YTlmMjY0Mzg0ODFjYmM5NGZlMDBkMTc4NiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY0NzkyNjcwMDAwMDAwNiwtNzkuNDE5NzQ5N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kZDgzMGVlNjcxZmQ0MDFmYjMwMTdiYWE3YmRiMDc2Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80MzM5NWVkYmIzMTA0MjUxYjk3YmYwMzA4ZDcxNDY5ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83MGJlMTg3MDVlNGI0ZTJjODcwN2RjYjM1YzhhMDRlMyA9ICQoJzxkaXYgaWQ9Imh0bWxfNzBiZTE4NzA1ZTRiNGUyYzg3MDdkY2IzNWM4YTA0ZTMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxpdHRsZSBQb3J0dWdhbCwgVHJpbml0eSwgV2VzdCBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80MzM5NWVkYmIzMTA0MjUxYjk3YmYwMzA4ZDcxNDY5ZC5zZXRDb250ZW50KGh0bWxfNzBiZTE4NzA1ZTRiNGUyYzg3MDdkY2IzNWM4YTA0ZTMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDNmNjk4NmE5ZjI2NDM4NDgxY2JjOTRmZTAwZDE3ODYuYmluZFBvcHVwKHBvcHVwXzQzMzk1ZWRiYjMxMDQyNTFiOTdiZjAzMDhkNzE0NjlkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzdhOGMwZmQ1ZDYxYjQzOGY5ZjE4MjA3MTNiOTAzOTVmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzI3OTI5MiwtNzkuMjYyMDI5NDAwMDAwMDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGQ4MzBlZTY3MWZkNDAxZmIzMDE3YmFhN2JkYjA3NmMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzIyYzJkNWZlZGMzNGQ4Mjk0YmVjYzgzYjcwYzc4MTIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWQyN2ExODk4MmQ2NDI3NGE1ZjBhYjY4NDNkNzAzZTIgPSAkKCc8ZGl2IGlkPSJodG1sXzVkMjdhMTg5ODJkNjQyNzRhNWYwYWI2ODQzZDcwM2UyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FYXN0IEJpcmNobW91bnQgUGFyaywgSW9udmlldywgS2VubmVkeSBQYXJrLCBTY2FyYm9yb3VnaDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzIyYzJkNWZlZGMzNGQ4Mjk0YmVjYzgzYjcwYzc4MTIuc2V0Q29udGVudChodG1sXzVkMjdhMTg5ODJkNjQyNzRhNWYwYWI2ODQzZDcwM2UyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzdhOGMwZmQ1ZDYxYjQzOGY5ZjE4MjA3MTNiOTAzOTVmLmJpbmRQb3B1cChwb3B1cF9jMjJjMmQ1ZmVkYzM0ZDgyOTRiZWNjODNiNzBjNzgxMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80OWU0ZDllNzQ0MTY0MjEwYjljMzU3NzZiMDk1YTlkMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc4Njk0NzMsLTc5LjM4NTk3NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kZDgzMGVlNjcxZmQ0MDFmYjMwMTdiYWE3YmRiMDc2Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mODVkZWY1MzY1MWI0ZDZmYmQxNjcxNWU0ZGMyNTYzMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iMWRhODgwZGE1YzM0NTVhYjYzN2ZkOGE1ZDc1MzdlNSA9ICQoJzxkaXYgaWQ9Imh0bWxfYjFkYTg4MGRhNWMzNDU1YWI2MzdmZDhhNWQ3NTM3ZTUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJheXZpZXcgVmlsbGFnZSwgTm9ydGggWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjg1ZGVmNTM2NTFiNGQ2ZmJkMTY3MTVlNGRjMjU2MzMuc2V0Q29udGVudChodG1sX2IxZGE4ODBkYTVjMzQ1NWFiNjM3ZmQ4YTVkNzUzN2U1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQ5ZTRkOWU3NDQxNjQyMTBiOWMzNTc3NmIwOTVhOWQyLmJpbmRQb3B1cChwb3B1cF9mODVkZWY1MzY1MWI0ZDZmYmQxNjcxNWU0ZGMyNTYzMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xNWUxMjM4M2E5YTg0NGM1ODZkNjkzNjNjNTgzZGIzOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjczNzQ3MzIwMDAwMDAwNCwtNzkuNDY0NzYzMjk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGQ4MzBlZTY3MWZkNDAxZmIzMDE3YmFhN2JkYjA3NmMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGFjNWMyMWJjYmQ4NDVhZGI3YmY2N2E2OWY3ZjA1NmYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGQ0OTlhZDZiMWRiNDcyZmE1NTc3YWRmOWQzOGQxNGQgPSAkKCc8ZGl2IGlkPSJodG1sXzBkNDk5YWQ2YjFkYjQ3MmZhNTU3N2FkZjlkMzhkMTRkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DRkIgVG9yb250bywgRG93bnN2aWV3IEVhc3QsIE5vcnRoIFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzBhYzVjMjFiY2JkODQ1YWRiN2JmNjdhNjlmN2YwNTZmLnNldENvbnRlbnQoaHRtbF8wZDQ5OWFkNmIxZGI0NzJmYTU1NzdhZGY5ZDM4ZDE0ZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xNWUxMjM4M2E5YTg0NGM1ODZkNjkzNjNjNTgzZGIzOS5iaW5kUG9wdXAocG9wdXBfMGFjNWMyMWJjYmQ4NDVhZGI3YmY2N2E2OWY3ZjA1NmYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTA1ZGM5NDJjZDQ4NDIyZmI2ODI5OTQ5MjM5MTk3NmEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42Nzk1NTcxLC03OS4zNTIxODhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGQ4MzBlZTY3MWZkNDAxZmIzMDE3YmFhN2JkYjA3NmMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjA3MTM4ZWQ3YzIyNDAxOWI4NzFhMTdmZDUwYjk1N2EgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWEwODEyNDUyZDUyNGYxYmE2YjE3ZmNiYzlmYjY2YzIgPSAkKCc8ZGl2IGlkPSJodG1sXzVhMDgxMjQ1MmQ1MjRmMWJhNmIxN2ZjYmM5ZmI2NmMyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5UaGUgRGFuZm9ydGggV2VzdCwgUml2ZXJkYWxlLCBFYXN0IFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzYwNzEzOGVkN2MyMjQwMTliODcxYTE3ZmQ1MGI5NTdhLnNldENvbnRlbnQoaHRtbF81YTA4MTI0NTJkNTI0ZjFiYTZiMTdmY2JjOWZiNjZjMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81MDVkYzk0MmNkNDg0MjJmYjY4Mjk5NDkyMzkxOTc2YS5iaW5kUG9wdXAocG9wdXBfNjA3MTM4ZWQ3YzIyNDAxOWI4NzFhMTdmZDUwYjk1N2EpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODllNTgwMjc3NTk4NGU5YjkxYjBjMzY3NTk4NDdmZDcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NDcxNzY4LC03OS4zODE1NzY0MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kZDgzMGVlNjcxZmQ0MDFmYjMwMTdiYWE3YmRiMDc2Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wMWQ1ZjFmNjYzZmM0MDA0YTJkYTVmZWU4Y2MwODYwMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xMjZlMTY2NzdiZDc0NWE1YTJlZTQ4NGExMjRiNWE3ZiA9ICQoJzxkaXYgaWQ9Imh0bWxfMTI2ZTE2Njc3YmQ3NDVhNWEyZWU0ODRhMTI0YjVhN2YiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRlc2lnbiBFeGNoYW5nZSwgVG9yb250byBEb21pbmlvbiBDZW50cmUsIERvd250b3duIFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzAxZDVmMWY2NjNmYzQwMDRhMmRhNWZlZThjYzA4NjAyLnNldENvbnRlbnQoaHRtbF8xMjZlMTY2NzdiZDc0NWE1YTJlZTQ4NGExMjRiNWE3Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84OWU1ODAyNzc1OTg0ZTliOTFiMGMzNjc1OTg0N2ZkNy5iaW5kUG9wdXAocG9wdXBfMDFkNWYxZjY2M2ZjNDAwNGEyZGE1ZmVlOGNjMDg2MDIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDM3ZTE5ZTQ4MzU1NGNhZmExNzljOTY2ZGRiNDc3YzYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42MzY4NDcyLC03OS40MjgxOTE0MDAwMDAwMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kZDgzMGVlNjcxZmQ0MDFmYjMwMTdiYWE3YmRiMDc2Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80ZWNjYmZhNWU1ZWQ0ZWExODg3YTNhZGIxNWNhN2EwOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lNjRlYTcwNzM3MGQ0MWUwODRjNjUzMTFkN2E1Mzc0ZiA9ICQoJzxkaXYgaWQ9Imh0bWxfZTY0ZWE3MDczNzBkNDFlMDg0YzY1MzExZDdhNTM3NGYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJyb2NrdG9uLCBFeGhpYml0aW9uIFBsYWNlLCBQYXJrZGFsZSBWaWxsYWdlLCBXZXN0IFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzRlY2NiZmE1ZTVlZDRlYTE4ODdhM2FkYjE1Y2E3YTA4LnNldENvbnRlbnQoaHRtbF9lNjRlYTcwNzM3MGQ0MWUwODRjNjUzMTFkN2E1Mzc0Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80MzdlMTllNDgzNTU0Y2FmYTE3OWM5NjZkZGI0NzdjNi5iaW5kUG9wdXAocG9wdXBfNGVjY2JmYTVlNWVkNGVhMTg4N2EzYWRiMTVjYTdhMDgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfN2FkZGZkMzNkYzkzNGUwMjg3MzRjNTFjZmJlNTMzZWQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MTExMTE3MDAwMDAwMDQsLTc5LjI4NDU3NzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGQ4MzBlZTY3MWZkNDAxZmIzMDE3YmFhN2JkYjA3NmMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfM2IxOGJkODhlZTMyNGUwMWE5MTgxNTgzZTc2OGVhMjMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDg2ZDA1NjkyYWQ1NDJkYjlkMjdjNzJkYTcyOGQyNDAgPSAkKCc8ZGl2IGlkPSJodG1sXzQ4NmQwNTY5MmFkNTQyZGI5ZDI3YzcyZGE3MjhkMjQwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DbGFpcmxlYSwgR29sZGVuIE1pbGUsIE9ha3JpZGdlLCBTY2FyYm9yb3VnaDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfM2IxOGJkODhlZTMyNGUwMWE5MTgxNTgzZTc2OGVhMjMuc2V0Q29udGVudChodG1sXzQ4NmQwNTY5MmFkNTQyZGI5ZDI3YzcyZGE3MjhkMjQwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzdhZGRmZDMzZGM5MzRlMDI4NzM0YzUxY2ZiZTUzM2VkLmJpbmRQb3B1cChwb3B1cF8zYjE4YmQ4OGVlMzI0ZTAxYTkxODE1ODNlNzY4ZWEyMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80YTNhZDdhMmQ1ODc0NmRlODlhNWU0MGI4YTkyYjBiNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc1NzQ5MDIsLTc5LjM3NDcxNDA5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RkODMwZWU2NzFmZDQwMWZiMzAxN2JhYTdiZGIwNzZjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q3YjAzMzY0ZWZhZDRiZDY5Y2ZkMDQxNzNjMjFmMDI2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2YxNWEyOTMxZjQ2OTQwYjVhY2ZjNTQ2YmU4NTk5NGQ5ID0gJCgnPGRpdiBpZD0iaHRtbF9mMTVhMjkzMWY0Njk0MGI1YWNmYzU0NmJlODU5OTRkOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U2lsdmVyIEhpbGxzLCBZb3JrIE1pbGxzLCBOb3J0aCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kN2IwMzM2NGVmYWQ0YmQ2OWNmZDA0MTczYzIxZjAyNi5zZXRDb250ZW50KGh0bWxfZjE1YTI5MzFmNDY5NDBiNWFjZmM1NDZiZTg1OTk0ZDkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNGEzYWQ3YTJkNTg3NDZkZTg5YTVlNDBiOGE5MmIwYjcuYmluZFBvcHVwKHBvcHVwX2Q3YjAzMzY0ZWZhZDRiZDY5Y2ZkMDQxNzNjMjFmMDI2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzMzYmQ3OWQyMTI3YzRkODBiZmFkZTk1ZGVkOTBhZjIzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzM5MDE0NiwtNzkuNTA2OTQzNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kZDgzMGVlNjcxZmQ0MDFmYjMwMTdiYWE3YmRiMDc2Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kYTgxMjA1NDJjMTM0ZjA5YWQwOWIzNjIxNDM0ZTczZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iYzY5MGU4Y2EyYzM0YjkzYmMxZTAxYzI1ZTNmODI0OCA9ICQoJzxkaXYgaWQ9Imh0bWxfYmM2OTBlOGNhMmMzNGI5M2JjMWUwMWMyNWUzZjgyNDgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRvd25zdmlldyBXZXN0LCBOb3J0aCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kYTgxMjA1NDJjMTM0ZjA5YWQwOWIzNjIxNDM0ZTczZC5zZXRDb250ZW50KGh0bWxfYmM2OTBlOGNhMmMzNGI5M2JjMWUwMWMyNWUzZjgyNDgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzNiZDc5ZDIxMjdjNGQ4MGJmYWRlOTVkZWQ5MGFmMjMuYmluZFBvcHVwKHBvcHVwX2RhODEyMDU0MmMxMzRmMDlhZDA5YjM2MjE0MzRlNzNkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzJlZDQ3YjdiNmI3MTQyNTc5NTc5ZWFkY2I4MzEyYTBjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjY4OTk4NSwtNzkuMzE1NTcxNTk5OTk5OThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGQ4MzBlZTY3MWZkNDAxZmIzMDE3YmFhN2JkYjA3NmMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGIzMjQxNDBhMWU5NGEyNGJiMGJhNTEwOTAyNDAxYjMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzAwM2ZmOTZjOWUzNDc1MWE1NDhhZjIzOTA1NmVmZDAgPSAkKCc8ZGl2IGlkPSJodG1sXzcwMDNmZjk2YzllMzQ3NTFhNTQ4YWYyMzkwNTZlZmQwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5UaGUgQmVhY2hlcyBXZXN0LCBJbmRpYSBCYXphYXIsIEVhc3QgVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZGIzMjQxNDBhMWU5NGEyNGJiMGJhNTEwOTAyNDAxYjMuc2V0Q29udGVudChodG1sXzcwMDNmZjk2YzllMzQ3NTFhNTQ4YWYyMzkwNTZlZmQwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzJlZDQ3YjdiNmI3MTQyNTc5NTc5ZWFkY2I4MzEyYTBjLmJpbmRQb3B1cChwb3B1cF9kYjMyNDE0MGExZTk0YTI0YmIwYmE1MTA5MDI0MDFiMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lZGM0ZDRjMTA5MzE0ZDQyOGZhYjUyZWI0MzgzOWY3ZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY0ODE5ODUsLTc5LjM3OTgxNjkwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RkODMwZWU2NzFmZDQwMWZiMzAxN2JhYTdiZGIwNzZjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzY1YzdiNzY4MWUxMjRmNzdhNjAzM2Y4MjZmY2MzMjFlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM4NDg3Nzg4Njg5ZDQ0Yjg4MDE4OWIwY2UzMjc2ZGJlID0gJCgnPGRpdiBpZD0iaHRtbF8zODQ4Nzc4ODY4OWQ0NGI4ODAxODliMGNlMzI3NmRiZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q29tbWVyY2UgQ291cnQsIFZpY3RvcmlhIEhvdGVsLCBEb3dudG93biBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82NWM3Yjc2ODFlMTI0Zjc3YTYwMzNmODI2ZmNjMzIxZS5zZXRDb250ZW50KGh0bWxfMzg0ODc3ODg2ODlkNDRiODgwMTg5YjBjZTMyNzZkYmUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZWRjNGQ0YzEwOTMxNGQ0MjhmYWI1MmViNDM4MzlmN2QuYmluZFBvcHVwKHBvcHVwXzY1YzdiNzY4MWUxMjRmNzdhNjAzM2Y4MjZmY2MzMjFlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzRmM2Q5MDNlMjBkODRmOWViYTdmZmVmODFmMjRjNDMxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzEzNzU2MjAwMDAwMDA2LC03OS40OTAwNzM4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RkODMwZWU2NzFmZDQwMWZiMzAxN2JhYTdiZGIwNzZjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzRiNzBlYWM4ZDdhNDRjMjQ5ODM4YzBhYzFlNjU3YWU3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2JjZjk5ZWIxN2E4MjRiYWRiMzFiN2UwMWRiNjg1Y2FkID0gJCgnPGRpdiBpZD0iaHRtbF9iY2Y5OWViMTdhODI0YmFkYjMxYjdlMDFkYjY4NWNhZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RG93bnN2aWV3LCBOb3J0aCBQYXJrLCBVcHdvb2QgUGFyaywgTm9ydGggWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNGI3MGVhYzhkN2E0NGMyNDk4MzhjMGFjMWU2NTdhZTcuc2V0Q29udGVudChodG1sX2JjZjk5ZWIxN2E4MjRiYWRiMzFiN2UwMWRiNjg1Y2FkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzRmM2Q5MDNlMjBkODRmOWViYTdmZmVmODFmMjRjNDMxLmJpbmRQb3B1cChwb3B1cF80YjcwZWFjOGQ3YTQ0YzI0OTgzOGMwYWMxZTY1N2FlNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lNjJkYjU5MTk5YWM0N2QxOTA4ZmNhNjU1YWEwYjMyNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc1NjMwMzMsLTc5LjU2NTk2MzI5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RkODMwZWU2NzFmZDQwMWZiMzAxN2JhYTdiZGIwNzZjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Y0YzRmODQ3ODc4MzRkYTdiMjY1NWIxZjMyMTllN2JiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Y4NjE0MDIyMDNjYTQwNGE4MzE1YThkYjVmMzdhYjNkID0gJCgnPGRpdiBpZD0iaHRtbF9mODYxNDAyMjAzY2E0MDRhODMxNWE4ZGI1ZjM3YWIzZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SHVtYmVyIFN1bW1pdCwgTm9ydGggWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjRjNGY4NDc4NzgzNGRhN2IyNjU1YjFmMzIxOWU3YmIuc2V0Q29udGVudChodG1sX2Y4NjE0MDIyMDNjYTQwNGE4MzE1YThkYjVmMzdhYjNkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2U2MmRiNTkxOTlhYzQ3ZDE5MDhmY2E2NTVhYTBiMzI3LmJpbmRQb3B1cChwb3B1cF9mNGM0Zjg0Nzg3ODM0ZGE3YjI2NTViMWYzMjE5ZTdiYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yOWEzOThjMjNkNDI0OTdlYmZlYmJiYjIwZWFmNzQxZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcxNjMxNiwtNzkuMjM5NDc2MDk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGQ4MzBlZTY3MWZkNDAxZmIzMDE3YmFhN2JkYjA3NmMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTdlYTNmZGVjMTM3NDA3OTk5YTExYThhOWNlMmQyODQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWU1M2YxZTljMGIzNDYxZjliYWMyZGE0MjhiYzQxYjQgPSAkKCc8ZGl2IGlkPSJodG1sX2FlNTNmMWU5YzBiMzQ2MWY5YmFjMmRhNDI4YmM0MWI0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DbGlmZmNyZXN0LCBDbGlmZnNpZGUsIFNjYXJib3JvdWdoIFZpbGxhZ2UgV2VzdCwgU2NhcmJvcm91Z2g8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE3ZWEzZmRlYzEzNzQwNzk5OWExMWE4YTljZTJkMjg0LnNldENvbnRlbnQoaHRtbF9hZTUzZjFlOWMwYjM0NjFmOWJhYzJkYTQyOGJjNDFiNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yOWEzOThjMjNkNDI0OTdlYmZlYmJiYjIwZWFmNzQxZS5iaW5kUG9wdXAocG9wdXBfMTdlYTNmZGVjMTM3NDA3OTk5YTExYThhOWNlMmQyODQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjQ2YjNmMjkwN2VlNGU4NWFiMzExMmVjN2FlOGQ1NDIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43ODkwNTMsLTc5LjQwODQ5Mjc5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RkODMwZWU2NzFmZDQwMWZiMzAxN2JhYTdiZGIwNzZjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RiODg1ZDRkYzBlMzQ0YTVhYmFiM2NiZmE5MWFlM2M5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY1YTY3Yjc2M2MyOTRkYjA4MmFjZjYzYTQ5NmI5OGM3ID0gJCgnPGRpdiBpZD0iaHRtbF82NWE2N2I3NjNjMjk0ZGIwODJhY2Y2M2E0OTZiOThjNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TmV3dG9uYnJvb2ssIFdpbGxvd2RhbGUsIE5vcnRoIFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RiODg1ZDRkYzBlMzQ0YTVhYmFiM2NiZmE5MWFlM2M5LnNldENvbnRlbnQoaHRtbF82NWE2N2I3NjNjMjk0ZGIwODJhY2Y2M2E0OTZiOThjNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yNDZiM2YyOTA3ZWU0ZTg1YWIzMTEyZWM3YWU4ZDU0Mi5iaW5kUG9wdXAocG9wdXBfZGI4ODVkNGRjMGUzNDRhNWFiYWIzY2JmYTkxYWUzYzkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDk1ZTZhNzg1YjE5NDhhZTlhZTFjMmQxMzU3MTlmNTkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43Mjg0OTY0LC03OS40OTU2OTc0MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kZDgzMGVlNjcxZmQ0MDFmYjMwMTdiYWE3YmRiMDc2Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85NGU5ZmJiOTg4ZGQ0YmEwYTdjMzdkZGU4ZGM0Y2VkMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xNGE0ZDRjYmNmMDE0YzkzODkzMDIzYjUxMWFhNzg3ZSA9ICQoJzxkaXYgaWQ9Imh0bWxfMTRhNGQ0Y2JjZjAxNGM5Mzg5MzAyM2I1MTFhYTc4N2UiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRvd25zdmlldyBDZW50cmFsLCBOb3J0aCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85NGU5ZmJiOTg4ZGQ0YmEwYTdjMzdkZGU4ZGM0Y2VkMy5zZXRDb250ZW50KGh0bWxfMTRhNGQ0Y2JjZjAxNGM5Mzg5MzAyM2I1MTFhYTc4N2UpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDk1ZTZhNzg1YjE5NDhhZTlhZTFjMmQxMzU3MTlmNTkuYmluZFBvcHVwKHBvcHVwXzk0ZTlmYmI5ODhkZDRiYTBhN2MzN2RkZThkYzRjZWQzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2IyN2RjNzM1NmFjNTQ2Yzg4YzIwZmJkMTY2MDc3YzE3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjU5NTI1NSwtNzkuMzQwOTIzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RkODMwZWU2NzFmZDQwMWZiMzAxN2JhYTdiZGIwNzZjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzMzZGQyNDMxM2ZjMDQ5YzQ4ZGI5ZWI2NDY1ZGRkYTM4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzkxZjk3NjVkZWI5NDQ3YjRhYzcwYjcyN2FiNzc1MTU3ID0gJCgnPGRpdiBpZD0iaHRtbF85MWY5NzY1ZGViOTQ0N2I0YWM3MGI3MjdhYjc3NTE1NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3R1ZGlvIERpc3RyaWN0LCBFYXN0IFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzMzZGQyNDMxM2ZjMDQ5YzQ4ZGI5ZWI2NDY1ZGRkYTM4LnNldENvbnRlbnQoaHRtbF85MWY5NzY1ZGViOTQ0N2I0YWM3MGI3MjdhYjc3NTE1Nyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iMjdkYzczNTZhYzU0NmM4OGMyMGZiZDE2NjA3N2MxNy5iaW5kUG9wdXAocG9wdXBfMzNkZDI0MzEzZmMwNDljNDhkYjllYjY0NjVkZGRhMzgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNGM1MTM4YjJhZDU1NGFjOTkwNTEyYjBjYWNmZGZkYWMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MzMyODI1LC03OS40MTk3NDk3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RkODMwZWU2NzFmZDQwMWZiMzAxN2JhYTdiZGIwNzZjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RjNGI5NzQ0MzBjMjRmYjBhYjY5ZjY4NWIzMDNlNDI1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNiM2FlNTg5NTgzODRhZDFhYjlhYzk4NmE5YjM0ZGY4ID0gJCgnPGRpdiBpZD0iaHRtbF8zYjNhZTU4OTU4Mzg0YWQxYWI5YWM5ODZhOWIzNGRmOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmVkZm9yZCBQYXJrLCBMYXdyZW5jZSBNYW5vciBFYXN0LCBOb3J0aCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kYzRiOTc0NDMwYzI0ZmIwYWI2OWY2ODViMzAzZTQyNS5zZXRDb250ZW50KGh0bWxfM2IzYWU1ODk1ODM4NGFkMWFiOWFjOTg2YTliMzRkZjgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNGM1MTM4YjJhZDU1NGFjOTkwNTEyYjBjYWNmZGZkYWMuYmluZFBvcHVwKHBvcHVwX2RjNGI5NzQ0MzBjMjRmYjBhYjY5ZjY4NWIzMDNlNDI1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzM4NDk0Y2JmZjg3NzRlYmI5YzE3MjEwMWUzMzIxNDc4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjkxMTE1OCwtNzkuNDc2MDEzMjk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGQ4MzBlZTY3MWZkNDAxZmIzMDE3YmFhN2JkYjA3NmMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjY2NGZhODkyNzQwNGViZmJjOGQ0ZjgyYjJkNzIzYmUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjJiNGQ3YjBkOWE5NDg2M2FiYmE4YWIwMDVmYzY3YjcgPSAkKCc8ZGl2IGlkPSJodG1sX2IyYjRkN2IwZDlhOTQ4NjNhYmJhOGFiMDA1ZmM2N2I3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5EZWwgUmF5LCBLZWVsZXNkYWxlLCBNb3VudCBEZW5uaXMsIFNpbHZlcnRob3JuLCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iNjY0ZmE4OTI3NDA0ZWJmYmM4ZDRmODJiMmQ3MjNiZS5zZXRDb250ZW50KGh0bWxfYjJiNGQ3YjBkOWE5NDg2M2FiYmE4YWIwMDVmYzY3YjcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzg0OTRjYmZmODc3NGViYjljMTcyMTAxZTMzMjE0NzguYmluZFBvcHVwKHBvcHVwX2I2NjRmYTg5Mjc0MDRlYmZiYzhkNGY4MmIyZDcyM2JlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2EyOTIzYzUyZjU5NjQxZjFiZWNjNTViODQyMDYxYjg5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzI0NzY1OSwtNzkuNTMyMjQyNDAwMDAwMDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGQ4MzBlZTY3MWZkNDAxZmIzMDE3YmFhN2JkYjA3NmMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjU4NTNlZTFhMTczNGJjMTlkNWM0YTUxOGIwZGE1YmMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDVhNzA5MTMwMDRjNDBjYTkzOGZmM2QwMDQxMGZlMWIgPSAkKCc8ZGl2IGlkPSJodG1sX2Q1YTcwOTEzMDA0YzQwY2E5MzhmZjNkMDA0MTBmZTFiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FbWVyeSwgSHVtYmVybGVhLCBOb3J0aCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82NTg1M2VlMWExNzM0YmMxOWQ1YzRhNTE4YjBkYTViYy5zZXRDb250ZW50KGh0bWxfZDVhNzA5MTMwMDRjNDBjYTkzOGZmM2QwMDQxMGZlMWIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTI5MjNjNTJmNTk2NDFmMWJlY2M1NWI4NDIwNjFiODkuYmluZFBvcHVwKHBvcHVwXzY1ODUzZWUxYTE3MzRiYzE5ZDVjNGE1MThiMGRhNWJjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzRjMGYxNmFhMDg2MDQyZWI4ZWY1MzVmNDRiNzZjNjkwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjkyNjU3MDAwMDAwMDA0LC03OS4yNjQ4NDgxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RkODMwZWU2NzFmZDQwMWZiMzAxN2JhYTdiZGIwNzZjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Y3YzNkN2RhZTQzZjQ4NTU4NDhiZDQ4Y2FmNDgxZDQ3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FkNjY5MTRiZjU4MjQwZThiN2VhMjcxODM2YWU0YmEzID0gJCgnPGRpdiBpZD0iaHRtbF9hZDY2OTE0YmY1ODI0MGU4YjdlYTI3MTgzNmFlNGJhMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmlyY2ggQ2xpZmYsIENsaWZmc2lkZSBXZXN0LCBTY2FyYm9yb3VnaDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjdjM2Q3ZGFlNDNmNDg1NTg0OGJkNDhjYWY0ODFkNDcuc2V0Q29udGVudChodG1sX2FkNjY5MTRiZjU4MjQwZThiN2VhMjcxODM2YWU0YmEzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzRjMGYxNmFhMDg2MDQyZWI4ZWY1MzVmNDRiNzZjNjkwLmJpbmRQb3B1cChwb3B1cF9mN2MzZDdkYWU0M2Y0ODU1ODQ4YmQ0OGNhZjQ4MWQ0Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82ZjFhNDhkNDZjNDQ0YWZkOWQzZWYwODg2MTZjYTlmOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc3MDExOTksLTc5LjQwODQ5Mjc5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RkODMwZWU2NzFmZDQwMWZiMzAxN2JhYTdiZGIwNzZjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc0YWIxNWNmZjdjZTRlNTE4YWE0Mzg1NjJkMTYxZGI2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzEwMTcwN2MyZWQ0NjRhZDFiM2FkYTU5NjM4NWM5ZWU3ID0gJCgnPGRpdiBpZD0iaHRtbF8xMDE3MDdjMmVkNDY0YWQxYjNhZGE1OTYzODVjOWVlNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V2lsbG93ZGFsZSBTb3V0aCwgTm9ydGggWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzRhYjE1Y2ZmN2NlNGU1MThhYTQzODU2MmQxNjFkYjYuc2V0Q29udGVudChodG1sXzEwMTcwN2MyZWQ0NjRhZDFiM2FkYTU5NjM4NWM5ZWU3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzZmMWE0OGQ0NmM0NDRhZmQ5ZDNlZjA4ODYxNmNhOWY4LmJpbmRQb3B1cChwb3B1cF83NGFiMTVjZmY3Y2U0ZTUxOGFhNDM4NTYyZDE2MWRiNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lZjI1NTE0ZmY5MjU0NzRkOTIxZjZhYThhYjgzMzkyMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc2MTYzMTMsLTc5LjUyMDk5OTQwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RkODMwZWU2NzFmZDQwMWZiMzAxN2JhYTdiZGIwNzZjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI4YmIwZGQyMWQ2ODRkMTdiYzhhZmZjNWVlN2NjNWMzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ZlNzMxY2E2OTJhMTQ5NjU5NWE1ZjA1YWFiMjE5MDIwID0gJCgnPGRpdiBpZD0iaHRtbF9mZTczMWNhNjkyYTE0OTY1OTVhNWYwNWFhYjIxOTAyMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RG93bnN2aWV3IE5vcnRod2VzdCwgTm9ydGggWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjhiYjBkZDIxZDY4NGQxN2JjOGFmZmM1ZWU3Y2M1YzMuc2V0Q29udGVudChodG1sX2ZlNzMxY2E2OTJhMTQ5NjU5NWE1ZjA1YWFiMjE5MDIwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2VmMjU1MTRmZjkyNTQ3NGQ5MjFmNmFhOGFiODMzOTIwLmJpbmRQb3B1cChwb3B1cF8yOGJiMGRkMjFkNjg0ZDE3YmM4YWZmYzVlZTdjYzVjMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85OTdmYTQ0OWFmM2Y0MWY4OWM1NDE3NjRmY2U2NGNlNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcyODAyMDUsLTc5LjM4ODc5MDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGQ4MzBlZTY3MWZkNDAxZmIzMDE3YmFhN2JkYjA3NmMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2Q4ODUzMjc3ODg0NDE3M2FmMmNiMmIzMDA5ZTI2YzAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGZjNzBkZWIyODI2NGU2Nzg1YWM5ODU2Y2FjZGQ4NDUgPSAkKCc8ZGl2IGlkPSJodG1sXzBmYzcwZGViMjgyNjRlNjc4NWFjOTg1NmNhY2RkODQ1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MYXdyZW5jZSBQYXJrLCBDZW50cmFsIFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzdkODg1MzI3Nzg4NDQxNzNhZjJjYjJiMzAwOWUyNmMwLnNldENvbnRlbnQoaHRtbF8wZmM3MGRlYjI4MjY0ZTY3ODVhYzk4NTZjYWNkZDg0NSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85OTdmYTQ0OWFmM2Y0MWY4OWM1NDE3NjRmY2U2NGNlNS5iaW5kUG9wdXAocG9wdXBfN2Q4ODUzMjc3ODg0NDE3M2FmMmNiMmIzMDA5ZTI2YzApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTJkMDI1NTU1ZTA1NDBiYmI5MGY2MzhkMTUwZjZmMTIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MTE2OTQ4LC03OS40MTY5MzU1OTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kZDgzMGVlNjcxZmQ0MDFmYjMwMTdiYWE3YmRiMDc2Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84NThhOGI0MGVhMmU0MDJlYWIxZmMzMTZhYjk3ZjQxZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hMmQ3NTRlNmVjOWY0YmM3YTA5ODI0YTk2NmE4YTU3OSA9ICQoJzxkaXYgaWQ9Imh0bWxfYTJkNzU0ZTZlYzlmNGJjN2EwOTgyNGE5NjZhOGE1NzkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJvc2VsYXduLCBDZW50cmFsIFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg1OGE4YjQwZWEyZTQwMmVhYjFmYzMxNmFiOTdmNDFkLnNldENvbnRlbnQoaHRtbF9hMmQ3NTRlNmVjOWY0YmM3YTA5ODI0YTk2NmE4YTU3OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hMmQwMjU1NTVlMDU0MGJiYjkwZjYzOGQxNTBmNmYxMi5iaW5kUG9wdXAocG9wdXBfODU4YThiNDBlYTJlNDAyZWFiMWZjMzE2YWI5N2Y0MWQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTMxMTYwMzY1NWQwNDk3NzllOTA4MGI4Y2I4OTI3ZTIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NzMxODUyOTk5OTk5OSwtNzkuNDg3MjYxOTAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGQ4MzBlZTY3MWZkNDAxZmIzMDE3YmFhN2JkYjA3NmMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODBhODUxNzEyMjhmNGQ2NmFiMTNjMzQxOWMxMjczYjggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWYyYmY5ZWUyNjE1NGRiY2IzMmIzNDkzZmE0YWQxMDQgPSAkKCc8ZGl2IGlkPSJodG1sXzFmMmJmOWVlMjYxNTRkYmNiMzJiMzQ5M2ZhNGFkMTA0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5UaGUgSnVuY3Rpb24gTm9ydGgsIFJ1bm55bWVkZSwgWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODBhODUxNzEyMjhmNGQ2NmFiMTNjMzQxOWMxMjczYjguc2V0Q29udGVudChodG1sXzFmMmJmOWVlMjYxNTRkYmNiMzJiMzQ5M2ZhNGFkMTA0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzEzMTE2MDM2NTVkMDQ5Nzc5ZTkwODBiOGNiODkyN2UyLmJpbmRQb3B1cChwb3B1cF84MGE4NTE3MTIyOGY0ZDY2YWIxM2MzNDE5YzEyNzNiOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mN2RmZGExZTY3NDg0MjNkODY5NzhkZjdjNmI4MDM3NyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcwNjg3NiwtNzkuNTE4MTg4NDAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGQ4MzBlZTY3MWZkNDAxZmIzMDE3YmFhN2JkYjA3NmMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGM0OTA2ODliNjEzNDE4Njk3NTNkOTZhZjk2NTc4ODIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmI1NjllM2Q4NTIwNDBjYmJkOTFkYmM0N2U5YmQxMGMgPSAkKCc8ZGl2IGlkPSJodG1sX2JiNTY5ZTNkODUyMDQwY2JiZDkxZGJjNDdlOWJkMTBjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XZXN0b24sIFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzRjNDkwNjg5YjYxMzQxODY5NzUzZDk2YWY5NjU3ODgyLnNldENvbnRlbnQoaHRtbF9iYjU2OWUzZDg1MjA0MGNiYmQ5MWRiYzQ3ZTliZDEwYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mN2RmZGExZTY3NDg0MjNkODY5NzhkZjdjNmI4MDM3Ny5iaW5kUG9wdXAocG9wdXBfNGM0OTA2ODliNjEzNDE4Njk3NTNkOTZhZjk2NTc4ODIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWI2OTc0MTk3ZjQ3NDBmYTkxNGI4ZDViODQ4MGMwMDEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43NTc0MDk2LC03OS4yNzMzMDQwMDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kZDgzMGVlNjcxZmQ0MDFmYjMwMTdiYWE3YmRiMDc2Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lM2U2MDU3NWNmOTU0MjdhYWZkMDNmNDUyMzMxNDg0YiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wYThmNDgxMDY0MWI0ZDFiYjljN2U3ODM4YmMzN2ViYyA9ICQoJzxkaXYgaWQ9Imh0bWxfMGE4ZjQ4MTA2NDFiNGQxYmI5YzdlNzgzOGJjMzdlYmMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRvcnNldCBQYXJrLCBTY2FyYm9yb3VnaCBUb3duIENlbnRyZSwgV2V4Zm9yZCBIZWlnaHRzLCBTY2FyYm9yb3VnaDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTNlNjA1NzVjZjk1NDI3YWFmZDAzZjQ1MjMzMTQ4NGIuc2V0Q29udGVudChodG1sXzBhOGY0ODEwNjQxYjRkMWJiOWM3ZTc4MzhiYzM3ZWJjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzliNjk3NDE5N2Y0NzQwZmE5MTRiOGQ1Yjg0ODBjMDAxLmJpbmRQb3B1cChwb3B1cF9lM2U2MDU3NWNmOTU0MjdhYWZkMDNmNDUyMzMxNDg0Yik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80ZmRhODYzNzczNGE0NmJiODg4YjM1YjE2YmRmODhlYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc1Mjc1ODI5OTk5OTk5NiwtNzkuNDAwMDQ5M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kZDgzMGVlNjcxZmQ0MDFmYjMwMTdiYWE3YmRiMDc2Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zN2I0Yjc0MDQ1MDY0YjUxOTQ1NWE1NjNmYmY4N2MxMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kNzYxZDA4OGIzZjE0YTFmOTE0MGI4YWU2MmRiNThkNyA9ICQoJzxkaXYgaWQ9Imh0bWxfZDc2MWQwODhiM2YxNGExZjkxNDBiOGFlNjJkYjU4ZDciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPllvcmsgTWlsbHMgV2VzdCwgTm9ydGggWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzdiNGI3NDA0NTA2NGI1MTk0NTVhNTYzZmJmODdjMTAuc2V0Q29udGVudChodG1sX2Q3NjFkMDg4YjNmMTRhMWY5MTQwYjhhZTYyZGI1OGQ3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzRmZGE4NjM3NzM0YTQ2YmI4ODhiMzViMTZiZGY4OGVjLmJpbmRQb3B1cChwb3B1cF8zN2I0Yjc0MDQ1MDY0YjUxOTQ1NWE1NjNmYmY4N2MxMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yMGUyNDE3NjIzMzE0YmFmODQxNDYzYzYyYTU3ZDk3ZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcxMjc1MTEsLTc5LjM5MDE5NzVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGQ4MzBlZTY3MWZkNDAxZmIzMDE3YmFhN2JkYjA3NmMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjFiNmYxN2ZiNjZlNGFlZThjM2U3NjcyMWM4ZDg3MzUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzBhMTI2ODVhNDMxNDg2ZDg5OTQ5YjJiZDVhOTU4ZWQgPSAkKCc8ZGl2IGlkPSJodG1sXzcwYTEyNjg1YTQzMTQ4NmQ4OTk0OWIyYmQ1YTk1OGVkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5EYXZpc3ZpbGxlIE5vcnRoLCBDZW50cmFsIFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2IxYjZmMTdmYjY2ZTRhZWU4YzNlNzY3MjFjOGQ4NzM1LnNldENvbnRlbnQoaHRtbF83MGExMjY4NWE0MzE0ODZkODk5NDliMmJkNWE5NThlZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yMGUyNDE3NjIzMzE0YmFmODQxNDYzYzYyYTU3ZDk3ZS5iaW5kUG9wdXAocG9wdXBfYjFiNmYxN2ZiNjZlNGFlZThjM2U3NjcyMWM4ZDg3MzUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTNjNTU5MDI0NDlmNDZhYjllZjhjNDAzZTRiM2QwMWMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42OTY5NDc2LC03OS40MTEzMDcyMDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kZDgzMGVlNjcxZmQ0MDFmYjMwMTdiYWE3YmRiMDc2Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80MGRhZTE2ZGU0ZWE0ZDAwYjQyZTYxOTFmZDQ1MTYwZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80YTdiNDAyYzJlODk0OWY2OWI2ZDg2YWUxOTQyNmE5MCA9ICQoJzxkaXYgaWQ9Imh0bWxfNGE3YjQwMmMyZTg5NDlmNjliNmQ4NmFlMTk0MjZhOTAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZvcmVzdCBIaWxsIE5vcnRoLCBGb3Jlc3QgSGlsbCBXZXN0LCBDZW50cmFsIFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQwZGFlMTZkZTRlYTRkMDBiNDJlNjE5MWZkNDUxNjBlLnNldENvbnRlbnQoaHRtbF80YTdiNDAyYzJlODk0OWY2OWI2ZDg2YWUxOTQyNmE5MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xM2M1NTkwMjQ0OWY0NmFiOWVmOGM0MDNlNGIzZDAxYy5iaW5kUG9wdXAocG9wdXBfNDBkYWUxNmRlNGVhNGQwMGI0MmU2MTkxZmQ0NTE2MGUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTIwM2ViNTllNGJjNDA4MDg5ODUzZWVmOGZjYjc5YjIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NjE2MDgzLC03OS40NjQ3NjMyOTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kZDgzMGVlNjcxZmQ0MDFmYjMwMTdiYWE3YmRiMDc2Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yYTFhMTczYjUwNjg0MDE5Yjk1MWY1NTViYmI3ZGIyMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83OWUyMjAxNDFhZTk0ZTlmYTkzOGZhMmJlNmMzNGM1MSA9ICQoJzxkaXYgaWQ9Imh0bWxfNzllMjIwMTQxYWU5NGU5ZmE5MzhmYTJiZTZjMzRjNTEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkhpZ2ggUGFyaywgVGhlIEp1bmN0aW9uIFNvdXRoLCBXZXN0IFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzJhMWExNzNiNTA2ODQwMTliOTUxZjU1NWJiYjdkYjIzLnNldENvbnRlbnQoaHRtbF83OWUyMjAxNDFhZTk0ZTlmYTkzOGZhMmJlNmMzNGM1MSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85MjAzZWI1OWU0YmM0MDgwODk4NTNlZWY4ZmNiNzliMi5iaW5kUG9wdXAocG9wdXBfMmExYTE3M2I1MDY4NDAxOWI5NTFmNTU1YmJiN2RiMjMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjU5Njg2MzQxNWJmNGFhNTliNjFiMzNmYTk3ZTVhODYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42OTYzMTksLTc5LjUzMjI0MjQwMDAwMDAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RkODMwZWU2NzFmZDQwMWZiMzAxN2JhYTdiZGIwNzZjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NmOTc2ZWQ0N2EzYTQ1YTI5Yjg5NTZjMWJmZjcyMWY0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM0NWJlMDJmZWZmZDQwZmE5MmQ0N2FhNDJjMzFiZWJhID0gJCgnPGRpdiBpZD0iaHRtbF8zNDViZTAyZmVmZmQ0MGZhOTJkNDdhYTQyYzMxYmViYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V2VzdG1vdW50LCBFdG9iaWNva2U8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2NmOTc2ZWQ0N2EzYTQ1YTI5Yjg5NTZjMWJmZjcyMWY0LnNldENvbnRlbnQoaHRtbF8zNDViZTAyZmVmZmQ0MGZhOTJkNDdhYTQyYzMxYmViYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82NTk2ODYzNDE1YmY0YWE1OWI2MWIzM2ZhOTdlNWE4Ni5iaW5kUG9wdXAocG9wdXBfY2Y5NzZlZDQ3YTNhNDVhMjliODk1NmMxYmZmNzIxZjQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTM5YjdjZmQ5YTllNDA1MTkxYjBjMDk1MTU1MGYxMjEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43NTAwNzE1MDAwMDAwMDQsLTc5LjI5NTg0OTFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGQ4MzBlZTY3MWZkNDAxZmIzMDE3YmFhN2JkYjA3NmMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTJhNzRlYjA1OWM2NDc3NmJlYmVkNTI3ZGU0YjMwY2YgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTMzNTA1YmQwZmRlNDE0Nzg0OWNmMjIwZDI2NWIzY2EgPSAkKCc8ZGl2IGlkPSJodG1sX2EzMzUwNWJkMGZkZTQxNDc4NDljZjIyMGQyNjViM2NhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NYXJ5dmFsZSwgV2V4Zm9yZCwgU2NhcmJvcm91Z2g8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2UyYTc0ZWIwNTljNjQ3NzZiZWJlZDUyN2RlNGIzMGNmLnNldENvbnRlbnQoaHRtbF9hMzM1MDViZDBmZGU0MTQ3ODQ5Y2YyMjBkMjY1YjNjYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xMzliN2NmZDlhOWU0MDUxOTFiMGMwOTUxNTUwZjEyMS5iaW5kUG9wdXAocG9wdXBfZTJhNzRlYjA1OWM2NDc3NmJlYmVkNTI3ZGU0YjMwY2YpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZWY1YjRlZmRlZDNlNDY1Zjk4MjVlMDU1YWM3MzQ0NzUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43ODI3MzY0LC03OS40NDIyNTkzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RkODMwZWU2NzFmZDQwMWZiMzAxN2JhYTdiZGIwNzZjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Y2ZmY4NjI4NmM1OTRlYTY4ZmQyNDY4NGYzNjEwOTg3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzlkOTIyNGJkYTY5NzRhMGNhNGIxNGQ1MzI1Njc3NjFmID0gJCgnPGRpdiBpZD0iaHRtbF85ZDkyMjRiZGE2OTc0YTBjYTRiMTRkNTMyNTY3NzYxZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V2lsbG93ZGFsZSBXZXN0LCBOb3J0aCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mNmZmODYyODZjNTk0ZWE2OGZkMjQ2ODRmMzYxMDk4Ny5zZXRDb250ZW50KGh0bWxfOWQ5MjI0YmRhNjk3NGEwY2E0YjE0ZDUzMjU2Nzc2MWYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZWY1YjRlZmRlZDNlNDY1Zjk4MjVlMDU1YWM3MzQ0NzUuYmluZFBvcHVwKHBvcHVwX2Y2ZmY4NjI4NmM1OTRlYTY4ZmQyNDY4NGYzNjEwOTg3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2RkZTRmMDgwYjI4MTQ3YWE4M2MzN2M4MTAyZWQyNTI0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzE1MzgzNCwtNzkuNDA1Njc4NDAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGQ4MzBlZTY3MWZkNDAxZmIzMDE3YmFhN2JkYjA3NmMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTE0MDYzN2UyODc0NGM4MGIzOTU2MjJjMWNmNWEzMjkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTY0ZGIxOTk2MjZmNGUxMDk0NjNmMGE5OTlhMDI4Y2MgPSAkKCc8ZGl2IGlkPSJodG1sXzE2NGRiMTk5NjI2ZjRlMTA5NDYzZjBhOTk5YTAyOGNjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ob3J0aCBUb3JvbnRvIFdlc3QsIENlbnRyYWwgVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTE0MDYzN2UyODc0NGM4MGIzOTU2MjJjMWNmNWEzMjkuc2V0Q29udGVudChodG1sXzE2NGRiMTk5NjI2ZjRlMTA5NDYzZjBhOTk5YTAyOGNjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2RkZTRmMDgwYjI4MTQ3YWE4M2MzN2M4MTAyZWQyNTI0LmJpbmRQb3B1cChwb3B1cF9hMTQwNjM3ZTI4NzQ0YzgwYjM5NTYyMmMxY2Y1YTMyOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81YmJjN2U1NTQzNGQ0NjNlOGU0NzE0M2ZmN2I0NmVhMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY3MjcwOTcsLTc5LjQwNTY3ODQwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RkODMwZWU2NzFmZDQwMWZiMzAxN2JhYTdiZGIwNzZjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RiM2NlZTcwY2IzODRlZDdiOTcxNDY2Zjk5OTY0NGIwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFhMDVmMjViZTZiYzRkZDU5MGI4ZDY2ZWZlNTEyMWQ2ID0gJCgnPGRpdiBpZD0iaHRtbF8xYTA1ZjI1YmU2YmM0ZGQ1OTBiOGQ2NmVmZTUxMjFkNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VGhlIEFubmV4LCBOb3J0aCBNaWR0b3duLCBZb3JrdmlsbGUsIENlbnRyYWwgVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZGIzY2VlNzBjYjM4NGVkN2I5NzE0NjZmOTk5NjQ0YjAuc2V0Q29udGVudChodG1sXzFhMDVmMjViZTZiYzRkZDU5MGI4ZDY2ZWZlNTEyMWQ2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzViYmM3ZTU1NDM0ZDQ2M2U4ZTQ3MTQzZmY3YjQ2ZWEzLmJpbmRQb3B1cChwb3B1cF9kYjNjZWU3MGNiMzg0ZWQ3Yjk3MTQ2NmY5OTk2NDRiMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kMDljNDJjN2Q2ZWQ0NzUwYjg3NGEwYTdkMjM0MzI0MSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY0ODk1OTcsLTc5LjQ1NjMyNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kZDgzMGVlNjcxZmQ0MDFmYjMwMTdiYWE3YmRiMDc2Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xNGNjODBhNmEzN2M0NGU3OGY3NzU1NWFiYTlkMDFmOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mZTRlMDY5MGQwYWE0YWNmYmNjMWM1NzQwODI5N2NmNSA9ICQoJzxkaXYgaWQ9Imh0bWxfZmU0ZTA2OTBkMGFhNGFjZmJjYzFjNTc0MDgyOTdjZjUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBhcmtkYWxlLCBSb25jZXN2YWxsZXMsIFdlc3QgVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTRjYzgwYTZhMzdjNDRlNzhmNzc1NTVhYmE5ZDAxZjguc2V0Q29udGVudChodG1sX2ZlNGUwNjkwZDBhYTRhY2ZiY2MxYzU3NDA4Mjk3Y2Y1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2QwOWM0MmM3ZDZlZDQ3NTBiODc0YTBhN2QyMzQzMjQxLmJpbmRQb3B1cChwb3B1cF8xNGNjODBhNmEzN2M0NGU3OGY3NzU1NWFiYTlkMDFmOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84ZjZjYjlmYjBlZGM0MGEyOGZkYTkyNjQ5NTYyYWY5NyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjYzNjk2NTYsLTc5LjYxNTgxODk5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RkODMwZWU2NzFmZDQwMWZiMzAxN2JhYTdiZGIwNzZjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzZhMGQ4YTIxYTU1MTRjZWQ4MzM1NjcwNzIxMzk0N2ZjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzViMDU0ZmEwNmY0NjQ0NTFiMjRiNjE0NTQ1MGI4NDAxID0gJCgnPGRpdiBpZD0iaHRtbF81YjA1NGZhMDZmNDY0NDUxYjI0YjYxNDU0NTBiODQwMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2FuYWRhIFBvc3QgR2F0ZXdheSBQcm9jZXNzaW5nIENlbnRyZSwgTWlzc2lzc2F1Z2E8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzZhMGQ4YTIxYTU1MTRjZWQ4MzM1NjcwNzIxMzk0N2ZjLnNldENvbnRlbnQoaHRtbF81YjA1NGZhMDZmNDY0NDUxYjI0YjYxNDU0NTBiODQwMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84ZjZjYjlmYjBlZGM0MGEyOGZkYTkyNjQ5NTYyYWY5Ny5iaW5kUG9wdXAocG9wdXBfNmEwZDhhMjFhNTUxNGNlZDgzMzU2NzA3MjEzOTQ3ZmMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMmY1MTE1OWU4NDY1NGFlMmFlOTRiNmEzZTA5ZTFlNjggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42ODg5MDU0LC03OS41NTQ3MjQ0MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kZDgzMGVlNjcxZmQ0MDFmYjMwMTdiYWE3YmRiMDc2Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xNzM3M2MxODU4NGE0Mzk4OTYwZGQwNzE0NmQ0MDRlYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mMGY5N2NiYjQ0YzA0YmMzYjI1YjJhMTlkODJkODUwYyA9ICQoJzxkaXYgaWQ9Imh0bWxfZjBmOTdjYmI0NGMwNGJjM2IyNWIyYTE5ZDgyZDg1MGMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPktpbmdzdmlldyBWaWxsYWdlLCBNYXJ0aW4gR3JvdmUgR2FyZGVucywgUmljaHZpZXcgR2FyZGVucywgU3QuIFBoaWxsaXBzLCBFdG9iaWNva2U8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE3MzczYzE4NTg0YTQzOTg5NjBkZDA3MTQ2ZDQwNGVhLnNldENvbnRlbnQoaHRtbF9mMGY5N2NiYjQ0YzA0YmMzYjI1YjJhMTlkODJkODUwYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yZjUxMTU5ZTg0NjU0YWUyYWU5NGI2YTNlMDllMWU2OC5iaW5kUG9wdXAocG9wdXBfMTczNzNjMTg1ODRhNDM5ODk2MGRkMDcxNDZkNDA0ZWEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzdlZTFjZTA0YTA1NDg5MzgwN2EwM2Q3MmI0YTNjNmEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43OTQyMDAzLC03OS4yNjIwMjk0MDAwMDAwMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kZDgzMGVlNjcxZmQ0MDFmYjMwMTdiYWE3YmRiMDc2Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xZDg5ZDg3ZGUzZDg0NGQ4YjEyMzBkNmNlMjY1NTdmMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80YTFjNGE4NzZhY2M0Y2RhYTQ3ZmZiZjE4MGY4NGQ1ZSA9ICQoJzxkaXYgaWQ9Imh0bWxfNGExYzRhODc2YWNjNGNkYWE0N2ZmYmYxODBmODRkNWUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFnaW5jb3VydCwgU2NhcmJvcm91Z2g8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzFkODlkODdkZTNkODQ0ZDhiMTIzMGQ2Y2UyNjU1N2YyLnNldENvbnRlbnQoaHRtbF80YTFjNGE4NzZhY2M0Y2RhYTQ3ZmZiZjE4MGY4NGQ1ZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jN2VlMWNlMDRhMDU0ODkzODA3YTAzZDcyYjRhM2M2YS5iaW5kUG9wdXAocG9wdXBfMWQ4OWQ4N2RlM2Q4NDRkOGIxMjMwZDZjZTI2NTU3ZjIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMmM5ZTU1NDUwZGY3NDFmYzlmNjE5MTU4YTRhOTBlNGQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MDQzMjQ0LC03OS4zODg3OTAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RkODMwZWU2NzFmZDQwMWZiMzAxN2JhYTdiZGIwNzZjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M1YzBiNDg1Y2NlYjQxMDZhODE3YzYyYzMxMTZhMWQ0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M0OTZkZTJjNGNiNDRlYmViYTZkODc0M2JjN2JjYzIyID0gJCgnPGRpdiBpZD0iaHRtbF9jNDk2ZGUyYzRjYjQ0ZWJlYmE2ZDg3NDNiYzdiY2MyMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RGF2aXN2aWxsZSwgQ2VudHJhbCBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jNWMwYjQ4NWNjZWI0MTA2YTgxN2M2MmMzMTE2YTFkNC5zZXRDb250ZW50KGh0bWxfYzQ5NmRlMmM0Y2I0NGViZWJhNmQ4NzQzYmM3YmNjMjIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMmM5ZTU1NDUwZGY3NDFmYzlmNjE5MTU4YTRhOTBlNGQuYmluZFBvcHVwKHBvcHVwX2M1YzBiNDg1Y2NlYjQxMDZhODE3YzYyYzMxMTZhMWQ0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2QyZGI0MmVlY2FlYjQ2ODhiNjJiNmZlOWVhMjU1OWQyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjYyNjk1NiwtNzkuNDAwMDQ5M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kZDgzMGVlNjcxZmQ0MDFmYjMwMTdiYWE3YmRiMDc2Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81OTk3Y2ZjNTNhZWY0MDIxODVjMTViN2M5Mzk4NzZiYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iNDNiMzEyZDQ2OGM0Njk0YjdhOWIwYWZkN2IxY2E5MSA9ICQoJzxkaXYgaWQ9Imh0bWxfYjQzYjMxMmQ0NjhjNDY5NGI3YTliMGFmZDdiMWNhOTEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkhhcmJvcmQsIFVuaXZlcnNpdHkgb2YgVG9yb250bywgRG93bnRvd24gVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTk5N2NmYzUzYWVmNDAyMTg1YzE1YjdjOTM5ODc2YmMuc2V0Q29udGVudChodG1sX2I0M2IzMTJkNDY4YzQ2OTRiN2E5YjBhZmQ3YjFjYTkxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2QyZGI0MmVlY2FlYjQ2ODhiNjJiNmZlOWVhMjU1OWQyLmJpbmRQb3B1cChwb3B1cF81OTk3Y2ZjNTNhZWY0MDIxODVjMTViN2M5Mzk4NzZiYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84ZWU5OTRmYzdmMmU0MTQ0YjI4NjU0MzlmZjQ0M2YwZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY1MTU3MDYsLTc5LjQ4NDQ0OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGQ4MzBlZTY3MWZkNDAxZmIzMDE3YmFhN2JkYjA3NmMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTA1N2FkNjlhYWUzNDBkMWIyNTRlOGVlYjFhYTZmMmIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOWY4NzJlZTUwZWRjNDM5YzlhMmE3ODhjN2VjZGJmMzYgPSAkKCc8ZGl2IGlkPSJodG1sXzlmODcyZWU1MGVkYzQzOWM5YTJhNzg4YzdlY2RiZjM2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SdW5ueW1lZGUsIFN3YW5zZWEsIFdlc3QgVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTA1N2FkNjlhYWUzNDBkMWIyNTRlOGVlYjFhYTZmMmIuc2V0Q29udGVudChodG1sXzlmODcyZWU1MGVkYzQzOWM5YTJhNzg4YzdlY2RiZjM2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzhlZTk5NGZjN2YyZTQxNDRiMjg2NTQzOWZmNDQzZjBlLmJpbmRQb3B1cChwb3B1cF9hMDU3YWQ2OWFhZTM0MGQxYjI1NGU4ZWViMWFhNmYyYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84MGQzOGRmZjdjYzU0Y2IyOTc5ZTlkYzhlNTIxNjNkZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc4MTYzNzUsLTc5LjMwNDMwMjFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGQ4MzBlZTY3MWZkNDAxZmIzMDE3YmFhN2JkYjA3NmMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDExNDdlODc1Nzg4NGNiYzgxMzY5ZGVjODM4YTQwMjkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZGFkMTBiMGRlMDEwNDUwNWJlYWNhYmE2NWY2YzFhOGMgPSAkKCc8ZGl2IGlkPSJodG1sX2RhZDEwYjBkZTAxMDQ1MDViZWFjYWJhNjVmNmMxYThjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DbGFya3MgQ29ybmVycywgU3VsbGl2YW4sIFRhbSBPJiMzOTtTaGFudGVyLCBTY2FyYm9yb3VnaDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDExNDdlODc1Nzg4NGNiYzgxMzY5ZGVjODM4YTQwMjkuc2V0Q29udGVudChodG1sX2RhZDEwYjBkZTAxMDQ1MDViZWFjYWJhNjVmNmMxYThjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzgwZDM4ZGZmN2NjNTRjYjI5NzllOWRjOGU1MjE2M2RlLmJpbmRQb3B1cChwb3B1cF9kMTE0N2U4NzU3ODg0Y2JjODEzNjlkZWM4MzhhNDAyOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yNWQ1OTIyN2E3ODI0MTcyYTg3MWY3ZDAxYWVkNTRkYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY4OTU3NDMsLTc5LjM4MzE1OTkwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RkODMwZWU2NzFmZDQwMWZiMzAxN2JhYTdiZGIwNzZjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Y1ZTEyMDZkNTUyODQ4YjE5M2EzNDdmNmYxMTVkZDNlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FjYzhhMTM4MjRlYzQ1Mjg5ZGU5NmE3OGU3ZjExNTE2ID0gJCgnPGRpdiBpZD0iaHRtbF9hY2M4YTEzODI0ZWM0NTI4OWRlOTZhNzhlN2YxMTUxNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TW9vcmUgUGFyaywgU3VtbWVyaGlsbCBFYXN0LCBDZW50cmFsIFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y1ZTEyMDZkNTUyODQ4YjE5M2EzNDdmNmYxMTVkZDNlLnNldENvbnRlbnQoaHRtbF9hY2M4YTEzODI0ZWM0NTI4OWRlOTZhNzhlN2YxMTUxNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yNWQ1OTIyN2E3ODI0MTcyYTg3MWY3ZDAxYWVkNTRkYy5iaW5kUG9wdXAocG9wdXBfZjVlMTIwNmQ1NTI4NDhiMTkzYTM0N2Y2ZjExNWRkM2UpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTdjNDY0NGFjN2IwNDE1ZThiZWYyNDVjNzY2NDU0NDggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NTMyMDU3LC03OS40MDAwNDkzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RkODMwZWU2NzFmZDQwMWZiMzAxN2JhYTdiZGIwNzZjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNlNjdhOWM1OGQ4ZDQ0MDM4NmU1NTRjYzU5YzFhNzA5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2JjNmNmNTg0MmIyZDRjZTY4ZTdkZGJmYzQ2OGI1OTI1ID0gJCgnPGRpdiBpZD0iaHRtbF9iYzZjZjU4NDJiMmQ0Y2U2OGU3ZGRiZmM0NjhiNTkyNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2hpbmF0b3duLCBHcmFuZ2UgUGFyaywgS2Vuc2luZ3RvbiBNYXJrZXQsIERvd250b3duIFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNlNjdhOWM1OGQ4ZDQ0MDM4NmU1NTRjYzU5YzFhNzA5LnNldENvbnRlbnQoaHRtbF9iYzZjZjU4NDJiMmQ0Y2U2OGU3ZGRiZmM0NjhiNTkyNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hN2M0NjQ0YWM3YjA0MTVlOGJlZjI0NWM3NjY0NTQ0OC5iaW5kUG9wdXAocG9wdXBfM2U2N2E5YzU4ZDhkNDQwMzg2ZTU1NGNjNTljMWE3MDkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZmJjNTgyNDVjMjI2NGQwY2FiZWQwMjFhOTIzOGQ3NzcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My44MTUyNTIyLC03OS4yODQ1NzcyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RkODMwZWU2NzFmZDQwMWZiMzAxN2JhYTdiZGIwNzZjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhmMTA5MjMwNDc0MzQxOWJhNDA2NjEzNjc4YzkyYzBiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzlhMzljMmM0OGU3YTQ5NjZhODkyYjVhNzNhYzY2N2JmID0gJCgnPGRpdiBpZD0iaHRtbF85YTM5YzJjNDhlN2E0OTY2YTg5MmI1YTczYWM2NjdiZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QWdpbmNvdXJ0IE5vcnRoLCBMJiMzOTtBbW9yZWF1eCBFYXN0LCBNaWxsaWtlbiwgU3RlZWxlcyBFYXN0LCBTY2FyYm9yb3VnaDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOGYxMDkyMzA0NzQzNDE5YmE0MDY2MTM2NzhjOTJjMGIuc2V0Q29udGVudChodG1sXzlhMzljMmM0OGU3YTQ5NjZhODkyYjVhNzNhYzY2N2JmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ZiYzU4MjQ1YzIyNjRkMGNhYmVkMDIxYTkyMzhkNzc3LmJpbmRQb3B1cChwb3B1cF84ZjEwOTIzMDQ3NDM0MTliYTQwNjYxMzY3OGM5MmMwYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kNzQ3MTI4YzY3YzI0NzU0ODZiNmY2YTI2OGI4ODUzNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY4NjQxMjI5OTk5OTk5LC03OS40MDAwNDkzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RkODMwZWU2NzFmZDQwMWZiMzAxN2JhYTdiZGIwNzZjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE5NmJmMmVhOGQ4MDRkMjJiMTQ3OGJiMDlkMGY2NGI0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzdmYzhmYWU0ZDM1MjRhMWRiN2MwNzAzYmFmZDIyMDhhID0gJCgnPGRpdiBpZD0iaHRtbF83ZmM4ZmFlNGQzNTI0YTFkYjdjMDcwM2JhZmQyMjA4YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RGVlciBQYXJrLCBGb3Jlc3QgSGlsbCBTRSwgUmF0aG5lbGx5LCBTb3V0aCBIaWxsLCBTdW1tZXJoaWxsIFdlc3QsIENlbnRyYWwgVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTk2YmYyZWE4ZDgwNGQyMmIxNDc4YmIwOWQwZjY0YjQuc2V0Q29udGVudChodG1sXzdmYzhmYWU0ZDM1MjRhMWRiN2MwNzAzYmFmZDIyMDhhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Q3NDcxMjhjNjdjMjQ3NTQ4NmI2ZjZhMjY4Yjg4NTM0LmJpbmRQb3B1cChwb3B1cF8xOTZiZjJlYThkODA0ZDIyYjE0NzhiYjA5ZDBmNjRiNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wNWRjZDY1NDEwYmI0MDk4OGU3M2Q3NjY2ZDNiYWIxZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjYyODk0NjcsLTc5LjM5NDQxOTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGQ4MzBlZTY3MWZkNDAxZmIzMDE3YmFhN2JkYjA3NmMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTNjMWRhYTBiZWQ3NDQ5NjliN2MyNGIwOWVjMjI0MjUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjVkMjY3ZjNkMDc2NGQxNzk1MDEzYzg1NWRmNDJkNWUgPSAkKCc8ZGl2IGlkPSJodG1sXzI1ZDI2N2YzZDA3NjRkMTc5NTAxM2M4NTVkZjQyZDVlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DTiBUb3dlciwgQmF0aHVyc3QgUXVheSwgSXNsYW5kIGFpcnBvcnQsIEhhcmJvdXJmcm9udCBXZXN0LCBLaW5nIGFuZCBTcGFkaW5hLCBSYWlsd2F5IExhbmRzLCBTb3V0aCBOaWFnYXJhLCBEb3dudG93biBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81M2MxZGFhMGJlZDc0NDk2OWI3YzI0YjA5ZWMyMjQyNS5zZXRDb250ZW50KGh0bWxfMjVkMjY3ZjNkMDc2NGQxNzk1MDEzYzg1NWRmNDJkNWUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDVkY2Q2NTQxMGJiNDA5ODhlNzNkNzY2NmQzYmFiMWYuYmluZFBvcHVwKHBvcHVwXzUzYzFkYWEwYmVkNzQ0OTY5YjdjMjRiMDllYzIyNDI1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzU1MDg5NzNjNjQxZTQxNDY4NTI0NGUyODA3YWM1NTkzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjA1NjQ2NiwtNzkuNTAxMzIwNzAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGQ4MzBlZTY3MWZkNDAxZmIzMDE3YmFhN2JkYjA3NmMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfY2MxODMyMmY1Y2ZjNDFhNGIzNTk1ZjdhMDI5MzNjNzYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWNhMTE4NWFmZmIyNDg2ZmJiYjc0YzM0ZTBkMzZiOGYgPSAkKCc8ZGl2IGlkPSJodG1sXzFjYTExODVhZmZiMjQ4NmZiYmI3NGMzNGUwZDM2YjhmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IdW1iZXIgQmF5IFNob3JlcywgTWltaWNvIFNvdXRoLCBOZXcgVG9yb250bywgRXRvYmljb2tlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jYzE4MzIyZjVjZmM0MWE0YjM1OTVmN2EwMjkzM2M3Ni5zZXRDb250ZW50KGh0bWxfMWNhMTE4NWFmZmIyNDg2ZmJiYjc0YzM0ZTBkMzZiOGYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTUwODk3M2M2NDFlNDE0Njg1MjQ0ZTI4MDdhYzU1OTMuYmluZFBvcHVwKHBvcHVwX2NjMTgzMjJmNWNmYzQxYTRiMzU5NWY3YTAyOTMzYzc2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2I4MGZjNjg0NjIzYzQwYWJhNGVhYmI1ZGJiNTk5YjIxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzM5NDE2Mzk5OTk5OTk2LC03OS41ODg0MzY5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RkODMwZWU2NzFmZDQwMWZiMzAxN2JhYTdiZGIwNzZjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzgwMWFkOWY4OGU3YTRmZDVhMDVhMzY1MjQxYzNjNzdkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU2OGNiOGE1NzM2OTQ3MzA5ZjMzYmMyODNmZjcwMTA1ID0gJCgnPGRpdiBpZD0iaHRtbF81NjhjYjhhNTczNjk0NzMwOWYzM2JjMjgzZmY3MDEwNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QWxiaW9uIEdhcmRlbnMsIEJlYXVtb25kIEhlaWdodHMsIEh1bWJlcmdhdGUsIEphbWVzdG93biwgTW91bnQgT2xpdmUsIFNpbHZlcnN0b25lLCBTb3V0aCBTdGVlbGVzLCBUaGlzdGxldG93biwgRXRvYmljb2tlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84MDFhZDlmODhlN2E0ZmQ1YTA1YTM2NTI0MWMzYzc3ZC5zZXRDb250ZW50KGh0bWxfNTY4Y2I4YTU3MzY5NDczMDlmMzNiYzI4M2ZmNzAxMDUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjgwZmM2ODQ2MjNjNDBhYmE0ZWFiYjVkYmI1OTliMjEuYmluZFBvcHVwKHBvcHVwXzgwMWFkOWY4OGU3YTRmZDVhMDVhMzY1MjQxYzNjNzdkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2U5NDM0MDE4NGRhOTQzMTc4MjkwMWUwMTBjYjM1ZmQ5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzk5NTI1MjAwMDAwMDA1LC03OS4zMTgzODg3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RkODMwZWU2NzFmZDQwMWZiMzAxN2JhYTdiZGIwNzZjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM3NmNmNGE5Njg2NTQwMjI4NGU1NDcyYmUwZjA3N2Y0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI2NDE1NDdiYjc1ZjQ4ZjI4N2Q4MTkwMTg0NzI3MGI0ID0gJCgnPGRpdiBpZD0iaHRtbF8yNjQxNTQ3YmI3NWY0OGYyODdkODE5MDE4NDcyNzBiNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TCYjMzk7QW1vcmVhdXggV2VzdCwgU2NhcmJvcm91Z2g8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM3NmNmNGE5Njg2NTQwMjI4NGU1NDcyYmUwZjA3N2Y0LnNldENvbnRlbnQoaHRtbF8yNjQxNTQ3YmI3NWY0OGYyODdkODE5MDE4NDcyNzBiNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lOTQzNDAxODRkYTk0MzE3ODI5MDFlMDEwY2IzNWZkOS5iaW5kUG9wdXAocG9wdXBfMzc2Y2Y0YTk2ODY1NDAyMjg0ZTU0NzJiZTBmMDc3ZjQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzY0NzUwYmM1MTI1NGZlNTk1MDQzMjYyN2EyYTAwMzggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42Nzk1NjI2LC03OS4zNzc1Mjk0MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kZDgzMGVlNjcxZmQ0MDFmYjMwMTdiYWE3YmRiMDc2Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84MzAwZDA0OTBlZWM0YTFlOTE1NTQ2ZjdkYTgxYThhNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82Y2Q3ZWY5Y2RhYzI0YjJiYjgwZDI5MjBkNjc2Njk2OSA9ICQoJzxkaXYgaWQ9Imh0bWxfNmNkN2VmOWNkYWMyNGIyYmI4MGQyOTIwZDY3NjY5NjkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJvc2VkYWxlLCBEb3dudG93biBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84MzAwZDA0OTBlZWM0YTFlOTE1NTQ2ZjdkYTgxYThhNC5zZXRDb250ZW50KGh0bWxfNmNkN2VmOWNkYWMyNGIyYmI4MGQyOTIwZDY3NjY5NjkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzY0NzUwYmM1MTI1NGZlNTk1MDQzMjYyN2EyYTAwMzguYmluZFBvcHVwKHBvcHVwXzgzMDBkMDQ5MGVlYzRhMWU5MTU1NDZmN2RhODFhOGE0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzRkMmE1YmIwNzRkYTQ0YzQ4NGE0ZjYyZGY3MzM5NTQzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjQ2NDM1MiwtNzkuMzc0ODQ1OTk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGQ4MzBlZTY3MWZkNDAxZmIzMDE3YmFhN2JkYjA3NmMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfY2QzMjhhMGE0OTIzNDI5YTkyYzNjZTZjNzgzZmEwNmUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2FjZWY5NGM0NjQwNDhjYWExN2U4ODU3Mjg2MzM2MTAgPSAkKCc8ZGl2IGlkPSJodG1sXzNhY2VmOTRjNDY0MDQ4Y2FhMTdlODg1NzI4NjMzNjEwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TdG4gQSBQTyBCb3hlcyAyNSBUaGUgRXNwbGFuYWRlLCBEb3dudG93biBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jZDMyOGEwYTQ5MjM0MjlhOTJjM2NlNmM3ODNmYTA2ZS5zZXRDb250ZW50KGh0bWxfM2FjZWY5NGM0NjQwNDhjYWExN2U4ODU3Mjg2MzM2MTApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNGQyYTViYjA3NGRhNDRjNDg0YTRmNjJkZjczMzk1NDMuYmluZFBvcHVwKHBvcHVwX2NkMzI4YTBhNDkyMzQyOWE5MmMzY2U2Yzc4M2ZhMDZlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzI5NDMwNjE5OTAyMDQzZjI5OWM3ODM3NzgyM2MyY2FkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjAyNDEzNzAwMDAwMDEsLTc5LjU0MzQ4NDA5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RkODMwZWU2NzFmZDQwMWZiMzAxN2JhYTdiZGIwNzZjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzUwMTk2YTM0NWU2ZDRjMDlhN2U4YmRlNGFkZTRmZTk3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U3ZTk2YmNkZjU5NTQyOTU4YjU1YjVhOTA2NWQ0NjlmID0gJCgnPGRpdiBpZD0iaHRtbF9lN2U5NmJjZGY1OTU0Mjk1OGI1NWI1YTkwNjVkNDY5ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QWxkZXJ3b29kLCBMb25nIEJyYW5jaCwgRXRvYmljb2tlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81MDE5NmEzNDVlNmQ0YzA5YTdlOGJkZTRhZGU0ZmU5Ny5zZXRDb250ZW50KGh0bWxfZTdlOTZiY2RmNTk1NDI5NThiNTViNWE5MDY1ZDQ2OWYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjk0MzA2MTk5MDIwNDNmMjk5Yzc4Mzc3ODIzYzJjYWQuYmluZFBvcHVwKHBvcHVwXzUwMTk2YTM0NWU2ZDRjMDlhN2U4YmRlNGFkZTRmZTk3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2FhMmQxZmNjMWM0ZDRmNWZhMTc5M2JmMTVkZTQ2YmQyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzA2NzQ4Mjk5OTk5OTk0LC03OS41OTQwNTQ0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RkODMwZWU2NzFmZDQwMWZiMzAxN2JhYTdiZGIwNzZjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzRhMzg3NDAyODQxOTRlMjM5YjllZGU2NmQzMjNhMmRkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzAwMzFkNjllYjdlNTRhODI5MzA3MTY1NGY5ODZmY2EyID0gJCgnPGRpdiBpZD0iaHRtbF8wMDMxZDY5ZWI3ZTU0YTgyOTMwNzE2NTRmOTg2ZmNhMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tm9ydGh3ZXN0LCBFdG9iaWNva2U8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzRhMzg3NDAyODQxOTRlMjM5YjllZGU2NmQzMjNhMmRkLnNldENvbnRlbnQoaHRtbF8wMDMxZDY5ZWI3ZTU0YTgyOTMwNzE2NTRmOTg2ZmNhMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hYTJkMWZjYzFjNGQ0ZjVmYTE3OTNiZjE1ZGU0NmJkMi5iaW5kUG9wdXAocG9wdXBfNGEzODc0MDI4NDE5NGUyMzliOWVkZTY2ZDMyM2EyZGQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfN2IxNjhmYTZkZjBhNGRkOTlhZTE1OTg4YjZjMzczYzggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My44MzYxMjQ3MDAwMDAwMDYsLTc5LjIwNTYzNjA5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RkODMwZWU2NzFmZDQwMWZiMzAxN2JhYTdiZGIwNzZjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzVhMTU5YTA5ODA5YzQ0YjY4NzIyYzAzMTQwZjVkMjlhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg1ZjJkYjA5YWM1NjQ2ZDFhYzc4ZjJjMTY4Mzg1ZjMzID0gJCgnPGRpdiBpZD0iaHRtbF84NWYyZGIwOWFjNTY0NmQxYWM3OGYyYzE2ODM4NWYzMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VXBwZXIgUm91Z2UsIFNjYXJib3JvdWdoPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81YTE1OWEwOTgwOWM0NGI2ODcyMmMwMzE0MGY1ZDI5YS5zZXRDb250ZW50KGh0bWxfODVmMmRiMDlhYzU2NDZkMWFjNzhmMmMxNjgzODVmMzMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfN2IxNjhmYTZkZjBhNGRkOTlhZTE1OTg4YjZjMzczYzguYmluZFBvcHVwKHBvcHVwXzVhMTU5YTA5ODA5YzQ0YjY4NzIyYzAzMTQwZjVkMjlhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzcyNWVlMDJlOWNlMjRkMWNiZTY0OTZhZjk3MzNhNTQ0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjY3OTY3LC03OS4zNjc2NzUzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RkODMwZWU2NzFmZDQwMWZiMzAxN2JhYTdiZGIwNzZjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhjMGMwMzU5OTA0MjQ3MTc4YWE1YTI0NzhlOTEwYjZlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2RjMTE5OTcxNjE0YzQxZDQ5ZTFhY2Q3ZTMyMGY1YzQ3ID0gJCgnPGRpdiBpZD0iaHRtbF9kYzExOTk3MTYxNGM0MWQ0OWUxYWNkN2UzMjBmNWM0NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2FiYmFnZXRvd24sIFN0LiBKYW1lcyBUb3duLCBEb3dudG93biBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84YzBjMDM1OTkwNDI0NzE3OGFhNWEyNDc4ZTkxMGI2ZS5zZXRDb250ZW50KGh0bWxfZGMxMTk5NzE2MTRjNDFkNDllMWFjZDdlMzIwZjVjNDcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzI1ZWUwMmU5Y2UyNGQxY2JlNjQ5NmFmOTczM2E1NDQuYmluZFBvcHVwKHBvcHVwXzhjMGMwMzU5OTA0MjQ3MTc4YWE1YTI0NzhlOTEwYjZlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNiOGJlZDgzZmNiNDQ5NGNhNzdiOWFmZmRiOGQ5ZWI1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjQ4NDI5MiwtNzkuMzgyMjgwMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kZDgzMGVlNjcxZmQ0MDFmYjMwMTdiYWE3YmRiMDc2Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hYWRhZDU3OTVmYjE0ZTZkYjNhMWUzMTMwZjA5M2UyOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82YjRiZjAyOTkxYjU0OWNlYTRiYzczMDM5NDRjMWNhOCA9ICQoJzxkaXYgaWQ9Imh0bWxfNmI0YmYwMjk5MWI1NDljZWE0YmM3MzAzOTQ0YzFjYTgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZpcnN0IENhbmFkaWFuIFBsYWNlLCBVbmRlcmdyb3VuZCBjaXR5LCBEb3dudG93biBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hYWRhZDU3OTVmYjE0ZTZkYjNhMWUzMTMwZjA5M2UyOC5zZXRDb250ZW50KGh0bWxfNmI0YmYwMjk5MWI1NDljZWE0YmM3MzAzOTQ0YzFjYTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfM2I4YmVkODNmY2I0NDk0Y2E3N2I5YWZmZGI4ZDllYjUuYmluZFBvcHVwKHBvcHVwX2FhZGFkNTc5NWZiMTRlNmRiM2ExZTMxMzBmMDkzZTI4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzc1Yjk1Y2ViODY3YTQ4Y2ZiYjA2NTJmODUzZGM2NzM3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjUzNjUzNjAwMDAwMDA1LC03OS41MDY5NDM2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RkODMwZWU2NzFmZDQwMWZiMzAxN2JhYTdiZGIwNzZjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E2YjAwMmE5MTRmYzQyNGM5M2JkMWYxZWE1MzBmNjkyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQwYTM5YjEzN2I2MzQ2ODRiOTQyNjEwZWI3ZWUzMjY1ID0gJCgnPGRpdiBpZD0iaHRtbF80MGEzOWIxMzdiNjM0Njg0Yjk0MjYxMGViN2VlMzI2NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VGhlIEtpbmdzd2F5LCBNb250Z29tZXJ5IFJvYWQsIE9sZCBNaWxsIE5vcnRoLCBFdG9iaWNva2U8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E2YjAwMmE5MTRmYzQyNGM5M2JkMWYxZWE1MzBmNjkyLnNldENvbnRlbnQoaHRtbF80MGEzOWIxMzdiNjM0Njg0Yjk0MjYxMGViN2VlMzI2NSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83NWI5NWNlYjg2N2E0OGNmYmIwNjUyZjg1M2RjNjczNy5iaW5kUG9wdXAocG9wdXBfYTZiMDAyYTkxNGZjNDI0YzkzYmQxZjFlYTUzMGY2OTIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjJkNGY3NWY4YThhNDNkZGFjNDU5Y2NiNzgyYWY1OTcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NjU4NTk5LC03OS4zODMxNTk5MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kZDgzMGVlNjcxZmQ0MDFmYjMwMTdiYWE3YmRiMDc2Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zYjA3OGJjMzIxMTI0MGQ0YmVkYTAyNzNlMTkxZTk4MSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kMTQxMWFhYTQ0Y2Q0NDk5YWRjYmE2ZGJlYjg3ZDdmOSA9ICQoJzxkaXYgaWQ9Imh0bWxfZDE0MTFhYWE0NGNkNDQ5OWFkY2JhNmRiZWI4N2Q3ZjkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNodXJjaCBhbmQgV2VsbGVzbGV5LCBEb3dudG93biBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zYjA3OGJjMzIxMTI0MGQ0YmVkYTAyNzNlMTkxZTk4MS5zZXRDb250ZW50KGh0bWxfZDE0MTFhYWE0NGNkNDQ5OWFkY2JhNmRiZWI4N2Q3ZjkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjJkNGY3NWY4YThhNDNkZGFjNDU5Y2NiNzgyYWY1OTcuYmluZFBvcHVwKHBvcHVwXzNiMDc4YmMzMjExMjQwZDRiZWRhMDI3M2UxOTFlOTgxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ZhMDc3YmI2NzdlYjRmZjZiN2Q4ZDJiNWJhNDM3ZTBlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjYyNzQzOSwtNzkuMzIxNTU4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RkODMwZWU2NzFmZDQwMWZiMzAxN2JhYTdiZGIwNzZjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NhNTZmOWFiYTE4ZTRhZDhiMmFmNDQ3Y2JiODE4OThhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2EzMmY2M2FmZTAyNDQ4YTQ5ZmQyYjY0Y2FlZDY0MTg1ID0gJCgnPGRpdiBpZD0iaHRtbF9hMzJmNjNhZmUwMjQ0OGE0OWZkMmI2NGNhZWQ2NDE4NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QnVzaW5lc3MgUmVwbHkgTWFpbCBQcm9jZXNzaW5nIENlbnRyZSA5NjkgRWFzdGVybiwgRWFzdCBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jYTU2ZjlhYmExOGU0YWQ4YjJhZjQ0N2NiYjgxODk4YS5zZXRDb250ZW50KGh0bWxfYTMyZjYzYWZlMDI0NDhhNDlmZDJiNjRjYWVkNjQxODUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZmEwNzdiYjY3N2ViNGZmNmI3ZDhkMmI1YmE0MzdlMGUuYmluZFBvcHVwKHBvcHVwX2NhNTZmOWFiYTE4ZTRhZDhiMmFmNDQ3Y2JiODE4OThhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2IwYTNiNjFhMjU0MjQ3OWM4NmQxODA1MjFmNjRiOGNkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjM2MjU3OSwtNzkuNDk4NTA5MDk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGQ4MzBlZTY3MWZkNDAxZmIzMDE3YmFhN2JkYjA3NmMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfM2E0ZTBhMWM5YTE2NDBlYzg3NDdmNzg3YjViMTk4NGYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmEyNDlmMGM5ZDk1NDdlMDhiMzQ2YzQ0Y2E1M2E2YmYgPSAkKCc8ZGl2IGlkPSJodG1sX2JhMjQ5ZjBjOWQ5NTQ3ZTA4YjM0NmM0NGNhNTNhNmJmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IdW1iZXIgQmF5LCBLaW5nJiMzOTtzIE1pbGwgUGFyaywgS2luZ3N3YXkgUGFyayBTb3V0aCBFYXN0LCBNaW1pY28gTkUsIE9sZCBNaWxsIFNvdXRoLCBUaGUgUXVlZW5zd2F5IEVhc3QsIFJveWFsIFlvcmsgU291dGggRWFzdCwgU3VubnlsZWEsIEV0b2JpY29rZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfM2E0ZTBhMWM5YTE2NDBlYzg3NDdmNzg3YjViMTk4NGYuc2V0Q29udGVudChodG1sX2JhMjQ5ZjBjOWQ5NTQ3ZTA4YjM0NmM0NGNhNTNhNmJmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2IwYTNiNjFhMjU0MjQ3OWM4NmQxODA1MjFmNjRiOGNkLmJpbmRQb3B1cChwb3B1cF8zYTRlMGExYzlhMTY0MGVjODc0N2Y3ODdiNWIxOTg0Zik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80MWQ0MTQzMTAxMWM0YjY3OThhMmM2Y2JlZTBiMDIzMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjYyODg0MDgsLTc5LjUyMDk5OTQwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RkODMwZWU2NzFmZDQwMWZiMzAxN2JhYTdiZGIwNzZjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2VlZWE5ZjdhM2Q4MjRmNGU4ZTAzOTE2ODc0OTU5YTA0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Y0MTBjMmQzNzE0ZjRkNGRiMWRlZjM3ZGE0YWQ5ODQ3ID0gJCgnPGRpdiBpZD0iaHRtbF9mNDEwYzJkMzcxNGY0ZDRkYjFkZWYzN2RhNGFkOTg0NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+S2luZ3N3YXkgUGFyayBTb3V0aCBXZXN0LCBNaW1pY28gTlcsIFRoZSBRdWVlbnN3YXkgV2VzdCwgUm95YWwgWW9yayBTb3V0aCBXZXN0LCBTb3V0aCBvZiBCbG9vciwgRXRvYmljb2tlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lZWVhOWY3YTNkODI0ZjRlOGUwMzkxNjg3NDk1OWEwNC5zZXRDb250ZW50KGh0bWxfZjQxMGMyZDM3MTRmNGQ0ZGIxZGVmMzdkYTRhZDk4NDcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDFkNDE0MzEwMTFjNGI2Nzk4YTJjNmNiZWUwYjAyMzEuYmluZFBvcHVwKHBvcHVwX2VlZWE5ZjdhM2Q4MjRmNGU4ZTAzOTE2ODc0OTU5YTA0KTsKCiAgICAgICAgICAgIAogICAgICAgIAo8L3NjcmlwdD4=\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>" | |
| ], | |
| "text/plain": [ | |
| "<folium.folium.Map at 0x7fe304be26d8>" | |
| ] | |
| }, | |
| "execution_count": 27, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "map_toronto = folium.Map(location=[latitude_toronto, longitude_toronto], zoom_start=10)\n", | |
| "\n", | |
| "# add markers to map\n", | |
| "for lat, lng, borough, Neighbourhood in zip(Toronto_df['Latitude'], Toronto_df['Longitude'], Toronto_df['Borough'], Toronto_df['Neighbourhood']):\n", | |
| " label = '{}, {}'.format(Neighbourhood, borough)\n", | |
| " label = folium.Popup(label, parse_html=True)\n", | |
| " folium.CircleMarker(\n", | |
| " [lat, lng],\n", | |
| " radius=5,\n", | |
| " popup=label,\n", | |
| " color='blue',\n", | |
| " fill=True,\n", | |
| " fill_color='#3186cc',\n", | |
| " fill_opacity=0.7,\n", | |
| " parse_html=False).add_to(map_toronto) \n", | |
| " \n", | |
| "map_toronto" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 34, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "CLIENT_ID = 'LA3EWGWUIM34V40S4ZIMDMTMKBZXIFZ4S4GSZI54KNJLZWPT' # your Foursquare ID\n", | |
| "CLIENT_SECRET = 'INR4MWFKULEBYX3V0R0KNHIJNUM3DGYRNAYXE1SSLAWXNVC3' # your Foursquare Secret\n", | |
| "VERSION = '20180605' # Foursquare API version\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 35, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "# defining radius and limit of venues to get\n", | |
| "radius=500\n", | |
| "LIMIT=100" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 38, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "def getNearbyVenues(names, latitudes, longitudes, radius=500):\n", | |
| " \n", | |
| " venues_list=[]\n", | |
| " for name, lat, lng in zip(names, latitudes, longitudes):\n", | |
| " print(name)\n", | |
| " \n", | |
| " # create the API request URL\n", | |
| " url = 'https://api.foursquare.com/v2/venues/explore?&client_id={}&client_secret={}&v={}&ll={},{}&radius={}&limit={}'.format(\n", | |
| " CLIENT_ID, \n", | |
| " CLIENT_SECRET, \n", | |
| " VERSION, \n", | |
| " lat, \n", | |
| " lng, \n", | |
| " radius, \n", | |
| " LIMIT)\n", | |
| " \n", | |
| " # make the GET request\n", | |
| " results = requests.get(url).json()[\"response\"]['groups'][0]['items']\n", | |
| " \n", | |
| " # return only relevant information for each nearby venue\n", | |
| " venues_list.append([(\n", | |
| " name, \n", | |
| " lat, \n", | |
| " lng, \n", | |
| " v['venue']['name'], \n", | |
| " v['venue']['location']['lat'], \n", | |
| " v['venue']['location']['lng'], \n", | |
| " v['venue']['categories'][0]['name']) for v in results])\n", | |
| "\n", | |
| " nearby_venues = pd.DataFrame([item for venue_list in venues_list for item in venue_list])\n", | |
| " nearby_venues.columns = ['Neighbourhood', \n", | |
| " 'Neighbourhood Latitude', \n", | |
| " 'Neighbourhood Longitude', \n", | |
| " 'Venue', \n", | |
| " 'Venue Latitude', \n", | |
| " 'Venue Longitude', \n", | |
| " 'Venue Category']\n", | |
| " \n", | |
| " return(nearby_venues)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 39, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Parkwoods\n", | |
| "Victoria Village\n", | |
| "Harbourfront, Regent Park\n", | |
| "Lawrence Heights, Lawrence Manor\n", | |
| "Queen's Park\n", | |
| "Islington Avenue\n", | |
| "Rouge, Malvern\n", | |
| "Don Mills North\n", | |
| "Woodbine Gardens, Parkview Hill\n", | |
| "Ryerson, Garden District\n", | |
| "Glencairn\n", | |
| "Cloverdale, Islington, Martin Grove, Princess Gardens, West Deane Park\n", | |
| "Highland Creek, Rouge Hill, Port Union\n", | |
| "Flemingdon Park, Don Mills South\n", | |
| "Woodbine Heights\n", | |
| "St. James Town\n", | |
| "Humewood-Cedarvale\n", | |
| "Bloordale Gardens, Eringate, Markland Wood, Old Burnhamthorpe\n", | |
| "Guildwood, Morningside, West Hill\n", | |
| "The Beaches\n", | |
| "Berczy Park\n", | |
| "Caledonia-Fairbanks\n", | |
| "Woburn\n", | |
| "Leaside\n", | |
| "Central Bay Street\n", | |
| "Christie\n", | |
| "Cedarbrae\n", | |
| "Hillcrest Village\n", | |
| "Bathurst Manor, Downsview North, Wilson Heights\n", | |
| "Thorncliffe Park\n", | |
| "Adelaide, King, Richmond\n", | |
| "Dovercourt Village, Dufferin\n", | |
| "Scarborough Village\n", | |
| "Fairview, Henry Farm, Oriole\n", | |
| "Northwood Park, York University\n", | |
| "East Toronto\n", | |
| "Harbourfront East, Toronto Islands, Union Station\n", | |
| "Little Portugal, Trinity\n", | |
| "East Birchmount Park, Ionview, Kennedy Park\n", | |
| "Bayview Village\n", | |
| "CFB Toronto, Downsview East\n", | |
| "The Danforth West, Riverdale\n", | |
| "Design Exchange, Toronto Dominion Centre\n", | |
| "Brockton, Exhibition Place, Parkdale Village\n", | |
| "Clairlea, Golden Mile, Oakridge\n", | |
| "Silver Hills, York Mills\n", | |
| "Downsview West\n", | |
| "The Beaches West, India Bazaar\n", | |
| "Commerce Court, Victoria Hotel\n", | |
| "Downsview, North Park, Upwood Park\n", | |
| "Humber Summit\n", | |
| "Cliffcrest, Cliffside, Scarborough Village West\n", | |
| "Newtonbrook, Willowdale\n", | |
| "Downsview Central\n", | |
| "Studio District\n", | |
| "Bedford Park, Lawrence Manor East\n", | |
| "Del Ray, Keelesdale, Mount Dennis, Silverthorn\n", | |
| "Emery, Humberlea\n", | |
| "Birch Cliff, Cliffside West\n", | |
| "Willowdale South\n", | |
| "Downsview Northwest\n", | |
| "Lawrence Park\n", | |
| "Roselawn\n", | |
| "The Junction North, Runnymede\n", | |
| "Weston\n", | |
| "Dorset Park, Scarborough Town Centre, Wexford Heights\n", | |
| "York Mills West\n", | |
| "Davisville North\n", | |
| "Forest Hill North, Forest Hill West\n", | |
| "High Park, The Junction South\n", | |
| "Westmount\n", | |
| "Maryvale, Wexford\n", | |
| "Willowdale West\n", | |
| "North Toronto West\n", | |
| "The Annex, North Midtown, Yorkville\n", | |
| "Parkdale, Roncesvalles\n", | |
| "Canada Post Gateway Processing Centre\n", | |
| "Kingsview Village, Martin Grove Gardens, Richview Gardens, St. Phillips\n", | |
| "Agincourt\n", | |
| "Davisville\n", | |
| "Harbord, University of Toronto\n", | |
| "Runnymede, Swansea\n", | |
| "Clarks Corners, Sullivan, Tam O'Shanter\n", | |
| "Moore Park, Summerhill East\n", | |
| "Chinatown, Grange Park, Kensington Market\n", | |
| "Agincourt North, L'Amoreaux East, Milliken, Steeles East\n", | |
| "Deer Park, Forest Hill SE, Rathnelly, South Hill, Summerhill West\n", | |
| "CN Tower, Bathurst Quay, Island airport, Harbourfront West, King and Spadina, Railway Lands, South Niagara\n", | |
| "Humber Bay Shores, Mimico South, New Toronto\n", | |
| "Albion Gardens, Beaumond Heights, Humbergate, Jamestown, Mount Olive, Silverstone, South Steeles, Thistletown\n", | |
| "L'Amoreaux West\n", | |
| "Rosedale\n", | |
| "Stn A PO Boxes 25 The Esplanade\n", | |
| "Alderwood, Long Branch\n", | |
| "Northwest\n", | |
| "Upper Rouge\n", | |
| "Cabbagetown, St. James Town\n", | |
| "First Canadian Place, Underground city\n", | |
| "The Kingsway, Montgomery Road, Old Mill North\n", | |
| "Church and Wellesley\n", | |
| "Business Reply Mail Processing Centre 969 Eastern\n", | |
| "Humber Bay, King's Mill Park, Kingsway Park South East, Mimico NE, Old Mill South, The Queensway East, Royal York South East, Sunnylea\n", | |
| "Kingsway Park South West, Mimico NW, The Queensway West, Royal York South West, South of Bloor\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "toronto_venues = getNearbyVenues(names=Toronto_df['Neighbourhood'],\n", | |
| " latitudes=Toronto_df['Latitude'],\n", | |
| " longitudes=Toronto_df['Longitude']\n", | |
| " )" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 40, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<div>\n", | |
| "<style scoped>\n", | |
| " .dataframe tbody tr th:only-of-type {\n", | |
| " vertical-align: middle;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe tbody tr th {\n", | |
| " vertical-align: top;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe thead th {\n", | |
| " text-align: right;\n", | |
| " }\n", | |
| "</style>\n", | |
| "<table border=\"1\" class=\"dataframe\">\n", | |
| " <thead>\n", | |
| " <tr style=\"text-align: right;\">\n", | |
| " <th></th>\n", | |
| " <th>Neighbourhood</th>\n", | |
| " <th>Neighbourhood Latitude</th>\n", | |
| " <th>Neighbourhood Longitude</th>\n", | |
| " <th>Venue</th>\n", | |
| " <th>Venue Latitude</th>\n", | |
| " <th>Venue Longitude</th>\n", | |
| " <th>Venue Category</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>0</th>\n", | |
| " <td>Parkwoods</td>\n", | |
| " <td>43.753259</td>\n", | |
| " <td>-79.329656</td>\n", | |
| " <td>Brookbanks Park</td>\n", | |
| " <td>43.751976</td>\n", | |
| " <td>-79.332140</td>\n", | |
| " <td>Park</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>1</th>\n", | |
| " <td>Parkwoods</td>\n", | |
| " <td>43.753259</td>\n", | |
| " <td>-79.329656</td>\n", | |
| " <td>KFC</td>\n", | |
| " <td>43.754387</td>\n", | |
| " <td>-79.333021</td>\n", | |
| " <td>Fast Food Restaurant</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>2</th>\n", | |
| " <td>Parkwoods</td>\n", | |
| " <td>43.753259</td>\n", | |
| " <td>-79.329656</td>\n", | |
| " <td>Variety Store</td>\n", | |
| " <td>43.751974</td>\n", | |
| " <td>-79.333114</td>\n", | |
| " <td>Food & Drink Shop</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>3</th>\n", | |
| " <td>Victoria Village</td>\n", | |
| " <td>43.725882</td>\n", | |
| " <td>-79.315572</td>\n", | |
| " <td>Victoria Village Arena</td>\n", | |
| " <td>43.723481</td>\n", | |
| " <td>-79.315635</td>\n", | |
| " <td>Hockey Arena</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>4</th>\n", | |
| " <td>Victoria Village</td>\n", | |
| " <td>43.725882</td>\n", | |
| " <td>-79.315572</td>\n", | |
| " <td>Tim Hortons</td>\n", | |
| " <td>43.725517</td>\n", | |
| " <td>-79.313103</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>5</th>\n", | |
| " <td>Victoria Village</td>\n", | |
| " <td>43.725882</td>\n", | |
| " <td>-79.315572</td>\n", | |
| " <td>Portugril</td>\n", | |
| " <td>43.725819</td>\n", | |
| " <td>-79.312785</td>\n", | |
| " <td>Portuguese Restaurant</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>6</th>\n", | |
| " <td>Victoria Village</td>\n", | |
| " <td>43.725882</td>\n", | |
| " <td>-79.315572</td>\n", | |
| " <td>Eglinton Ave E & Sloane Ave/Bermondsey Rd</td>\n", | |
| " <td>43.726086</td>\n", | |
| " <td>-79.313620</td>\n", | |
| " <td>Intersection</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>7</th>\n", | |
| " <td>Victoria Village</td>\n", | |
| " <td>43.725882</td>\n", | |
| " <td>-79.315572</td>\n", | |
| " <td>Pizza Nova</td>\n", | |
| " <td>43.725824</td>\n", | |
| " <td>-79.312860</td>\n", | |
| " <td>Pizza Place</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>8</th>\n", | |
| " <td>Harbourfront, Regent Park</td>\n", | |
| " <td>43.654260</td>\n", | |
| " <td>-79.360636</td>\n", | |
| " <td>Roselle Desserts</td>\n", | |
| " <td>43.653447</td>\n", | |
| " <td>-79.362017</td>\n", | |
| " <td>Bakery</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>9</th>\n", | |
| " <td>Harbourfront, Regent Park</td>\n", | |
| " <td>43.654260</td>\n", | |
| " <td>-79.360636</td>\n", | |
| " <td>Tandem Coffee</td>\n", | |
| " <td>43.653559</td>\n", | |
| " <td>-79.361809</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " Neighbourhood Neighbourhood Latitude Neighbourhood Longitude \\\n", | |
| "0 Parkwoods 43.753259 -79.329656 \n", | |
| "1 Parkwoods 43.753259 -79.329656 \n", | |
| "2 Parkwoods 43.753259 -79.329656 \n", | |
| "3 Victoria Village 43.725882 -79.315572 \n", | |
| "4 Victoria Village 43.725882 -79.315572 \n", | |
| "5 Victoria Village 43.725882 -79.315572 \n", | |
| "6 Victoria Village 43.725882 -79.315572 \n", | |
| "7 Victoria Village 43.725882 -79.315572 \n", | |
| "8 Harbourfront, Regent Park 43.654260 -79.360636 \n", | |
| "9 Harbourfront, Regent Park 43.654260 -79.360636 \n", | |
| "\n", | |
| " Venue Venue Latitude Venue Longitude \\\n", | |
| "0 Brookbanks Park 43.751976 -79.332140 \n", | |
| "1 KFC 43.754387 -79.333021 \n", | |
| "2 Variety Store 43.751974 -79.333114 \n", | |
| "3 Victoria Village Arena 43.723481 -79.315635 \n", | |
| "4 Tim Hortons 43.725517 -79.313103 \n", | |
| "5 Portugril 43.725819 -79.312785 \n", | |
| "6 Eglinton Ave E & Sloane Ave/Bermondsey Rd 43.726086 -79.313620 \n", | |
| "7 Pizza Nova 43.725824 -79.312860 \n", | |
| "8 Roselle Desserts 43.653447 -79.362017 \n", | |
| "9 Tandem Coffee 43.653559 -79.361809 \n", | |
| "\n", | |
| " Venue Category \n", | |
| "0 Park \n", | |
| "1 Fast Food Restaurant \n", | |
| "2 Food & Drink Shop \n", | |
| "3 Hockey Arena \n", | |
| "4 Coffee Shop \n", | |
| "5 Portuguese Restaurant \n", | |
| "6 Intersection \n", | |
| "7 Pizza Place \n", | |
| "8 Bakery \n", | |
| "9 Coffee Shop " | |
| ] | |
| }, | |
| "execution_count": 40, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "toronto_venues.head(10)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 41, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "(2246, 7)" | |
| ] | |
| }, | |
| "execution_count": 41, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "toronto_venues.shape\n", | |
| "\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 42, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<div>\n", | |
| "<style scoped>\n", | |
| " .dataframe tbody tr th:only-of-type {\n", | |
| " vertical-align: middle;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe tbody tr th {\n", | |
| " vertical-align: top;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe thead th {\n", | |
| " text-align: right;\n", | |
| " }\n", | |
| "</style>\n", | |
| "<table border=\"1\" class=\"dataframe\">\n", | |
| " <thead>\n", | |
| " <tr style=\"text-align: right;\">\n", | |
| " <th></th>\n", | |
| " <th>Neighbourhood Latitude</th>\n", | |
| " <th>Neighbourhood Longitude</th>\n", | |
| " <th>Venue</th>\n", | |
| " <th>Venue Latitude</th>\n", | |
| " <th>Venue Longitude</th>\n", | |
| " <th>Venue Category</th>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Neighbourhood</th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>Adelaide, King, Richmond</th>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Agincourt</th>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Agincourt North, L'Amoreaux East, Milliken, Steeles East</th>\n", | |
| " <td>2</td>\n", | |
| " <td>2</td>\n", | |
| " <td>2</td>\n", | |
| " <td>2</td>\n", | |
| " <td>2</td>\n", | |
| " <td>2</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Albion Gardens, Beaumond Heights, Humbergate, Jamestown, Mount Olive, Silverstone, South Steeles, Thistletown</th>\n", | |
| " <td>10</td>\n", | |
| " <td>10</td>\n", | |
| " <td>10</td>\n", | |
| " <td>10</td>\n", | |
| " <td>10</td>\n", | |
| " <td>10</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Alderwood, Long Branch</th>\n", | |
| " <td>10</td>\n", | |
| " <td>10</td>\n", | |
| " <td>10</td>\n", | |
| " <td>10</td>\n", | |
| " <td>10</td>\n", | |
| " <td>10</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Bathurst Manor, Downsview North, Wilson Heights</th>\n", | |
| " <td>18</td>\n", | |
| " <td>18</td>\n", | |
| " <td>18</td>\n", | |
| " <td>18</td>\n", | |
| " <td>18</td>\n", | |
| " <td>18</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Bayview Village</th>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Bedford Park, Lawrence Manor East</th>\n", | |
| " <td>24</td>\n", | |
| " <td>24</td>\n", | |
| " <td>24</td>\n", | |
| " <td>24</td>\n", | |
| " <td>24</td>\n", | |
| " <td>24</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Berczy Park</th>\n", | |
| " <td>55</td>\n", | |
| " <td>55</td>\n", | |
| " <td>55</td>\n", | |
| " <td>55</td>\n", | |
| " <td>55</td>\n", | |
| " <td>55</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Birch Cliff, Cliffside West</th>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Bloordale Gardens, Eringate, Markland Wood, Old Burnhamthorpe</th>\n", | |
| " <td>8</td>\n", | |
| " <td>8</td>\n", | |
| " <td>8</td>\n", | |
| " <td>8</td>\n", | |
| " <td>8</td>\n", | |
| " <td>8</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Brockton, Exhibition Place, Parkdale Village</th>\n", | |
| " <td>20</td>\n", | |
| " <td>20</td>\n", | |
| " <td>20</td>\n", | |
| " <td>20</td>\n", | |
| " <td>20</td>\n", | |
| " <td>20</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Business Reply Mail Processing Centre 969 Eastern</th>\n", | |
| " <td>17</td>\n", | |
| " <td>17</td>\n", | |
| " <td>17</td>\n", | |
| " <td>17</td>\n", | |
| " <td>17</td>\n", | |
| " <td>17</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>CFB Toronto, Downsview East</th>\n", | |
| " <td>3</td>\n", | |
| " <td>3</td>\n", | |
| " <td>3</td>\n", | |
| " <td>3</td>\n", | |
| " <td>3</td>\n", | |
| " <td>3</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>CN Tower, Bathurst Quay, Island airport, Harbourfront West, King and Spadina, Railway Lands, South Niagara</th>\n", | |
| " <td>15</td>\n", | |
| " <td>15</td>\n", | |
| " <td>15</td>\n", | |
| " <td>15</td>\n", | |
| " <td>15</td>\n", | |
| " <td>15</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Cabbagetown, St. James Town</th>\n", | |
| " <td>46</td>\n", | |
| " <td>46</td>\n", | |
| " <td>46</td>\n", | |
| " <td>46</td>\n", | |
| " <td>46</td>\n", | |
| " <td>46</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Caledonia-Fairbanks</th>\n", | |
| " <td>6</td>\n", | |
| " <td>6</td>\n", | |
| " <td>6</td>\n", | |
| " <td>6</td>\n", | |
| " <td>6</td>\n", | |
| " <td>6</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Canada Post Gateway Processing Centre</th>\n", | |
| " <td>10</td>\n", | |
| " <td>10</td>\n", | |
| " <td>10</td>\n", | |
| " <td>10</td>\n", | |
| " <td>10</td>\n", | |
| " <td>10</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Cedarbrae</th>\n", | |
| " <td>7</td>\n", | |
| " <td>7</td>\n", | |
| " <td>7</td>\n", | |
| " <td>7</td>\n", | |
| " <td>7</td>\n", | |
| " <td>7</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Central Bay Street</th>\n", | |
| " <td>87</td>\n", | |
| " <td>87</td>\n", | |
| " <td>87</td>\n", | |
| " <td>87</td>\n", | |
| " <td>87</td>\n", | |
| " <td>87</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Chinatown, Grange Park, Kensington Market</th>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Christie</th>\n", | |
| " <td>16</td>\n", | |
| " <td>16</td>\n", | |
| " <td>16</td>\n", | |
| " <td>16</td>\n", | |
| " <td>16</td>\n", | |
| " <td>16</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Church and Wellesley</th>\n", | |
| " <td>86</td>\n", | |
| " <td>86</td>\n", | |
| " <td>86</td>\n", | |
| " <td>86</td>\n", | |
| " <td>86</td>\n", | |
| " <td>86</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Clairlea, Golden Mile, Oakridge</th>\n", | |
| " <td>10</td>\n", | |
| " <td>10</td>\n", | |
| " <td>10</td>\n", | |
| " <td>10</td>\n", | |
| " <td>10</td>\n", | |
| " <td>10</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Clarks Corners, Sullivan, Tam O'Shanter</th>\n", | |
| " <td>10</td>\n", | |
| " <td>10</td>\n", | |
| " <td>10</td>\n", | |
| " <td>10</td>\n", | |
| " <td>10</td>\n", | |
| " <td>10</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Cliffcrest, Cliffside, Scarborough Village West</th>\n", | |
| " <td>2</td>\n", | |
| " <td>2</td>\n", | |
| " <td>2</td>\n", | |
| " <td>2</td>\n", | |
| " <td>2</td>\n", | |
| " <td>2</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Cloverdale, Islington, Martin Grove, Princess Gardens, West Deane Park</th>\n", | |
| " <td>1</td>\n", | |
| " <td>1</td>\n", | |
| " <td>1</td>\n", | |
| " <td>1</td>\n", | |
| " <td>1</td>\n", | |
| " <td>1</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Commerce Court, Victoria Hotel</th>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Davisville</th>\n", | |
| " <td>36</td>\n", | |
| " <td>36</td>\n", | |
| " <td>36</td>\n", | |
| " <td>36</td>\n", | |
| " <td>36</td>\n", | |
| " <td>36</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Davisville North</th>\n", | |
| " <td>6</td>\n", | |
| " <td>6</td>\n", | |
| " <td>6</td>\n", | |
| " <td>6</td>\n", | |
| " <td>6</td>\n", | |
| " <td>6</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>...</th>\n", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Northwest</th>\n", | |
| " <td>3</td>\n", | |
| " <td>3</td>\n", | |
| " <td>3</td>\n", | |
| " <td>3</td>\n", | |
| " <td>3</td>\n", | |
| " <td>3</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Northwood Park, York University</th>\n", | |
| " <td>7</td>\n", | |
| " <td>7</td>\n", | |
| " <td>7</td>\n", | |
| " <td>7</td>\n", | |
| " <td>7</td>\n", | |
| " <td>7</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Parkdale, Roncesvalles</th>\n", | |
| " <td>15</td>\n", | |
| " <td>15</td>\n", | |
| " <td>15</td>\n", | |
| " <td>15</td>\n", | |
| " <td>15</td>\n", | |
| " <td>15</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Parkwoods</th>\n", | |
| " <td>3</td>\n", | |
| " <td>3</td>\n", | |
| " <td>3</td>\n", | |
| " <td>3</td>\n", | |
| " <td>3</td>\n", | |
| " <td>3</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Queen's Park</th>\n", | |
| " <td>39</td>\n", | |
| " <td>39</td>\n", | |
| " <td>39</td>\n", | |
| " <td>39</td>\n", | |
| " <td>39</td>\n", | |
| " <td>39</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Rosedale</th>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Roselawn</th>\n", | |
| " <td>2</td>\n", | |
| " <td>2</td>\n", | |
| " <td>2</td>\n", | |
| " <td>2</td>\n", | |
| " <td>2</td>\n", | |
| " <td>2</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Rouge, Malvern</th>\n", | |
| " <td>1</td>\n", | |
| " <td>1</td>\n", | |
| " <td>1</td>\n", | |
| " <td>1</td>\n", | |
| " <td>1</td>\n", | |
| " <td>1</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Runnymede, Swansea</th>\n", | |
| " <td>39</td>\n", | |
| " <td>39</td>\n", | |
| " <td>39</td>\n", | |
| " <td>39</td>\n", | |
| " <td>39</td>\n", | |
| " <td>39</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Ryerson, Garden District</th>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Scarborough Village</th>\n", | |
| " <td>1</td>\n", | |
| " <td>1</td>\n", | |
| " <td>1</td>\n", | |
| " <td>1</td>\n", | |
| " <td>1</td>\n", | |
| " <td>1</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>St. James Town</th>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " <td>100</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Stn A PO Boxes 25 The Esplanade</th>\n", | |
| " <td>94</td>\n", | |
| " <td>94</td>\n", | |
| " <td>94</td>\n", | |
| " <td>94</td>\n", | |
| " <td>94</td>\n", | |
| " <td>94</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Studio District</th>\n", | |
| " <td>37</td>\n", | |
| " <td>37</td>\n", | |
| " <td>37</td>\n", | |
| " <td>37</td>\n", | |
| " <td>37</td>\n", | |
| " <td>37</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>The Annex, North Midtown, Yorkville</th>\n", | |
| " <td>23</td>\n", | |
| " <td>23</td>\n", | |
| " <td>23</td>\n", | |
| " <td>23</td>\n", | |
| " <td>23</td>\n", | |
| " <td>23</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>The Beaches</th>\n", | |
| " <td>5</td>\n", | |
| " <td>5</td>\n", | |
| " <td>5</td>\n", | |
| " <td>5</td>\n", | |
| " <td>5</td>\n", | |
| " <td>5</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>The Beaches West, India Bazaar</th>\n", | |
| " <td>21</td>\n", | |
| " <td>21</td>\n", | |
| " <td>21</td>\n", | |
| " <td>21</td>\n", | |
| " <td>21</td>\n", | |
| " <td>21</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>The Danforth West, Riverdale</th>\n", | |
| " <td>42</td>\n", | |
| " <td>42</td>\n", | |
| " <td>42</td>\n", | |
| " <td>42</td>\n", | |
| " <td>42</td>\n", | |
| " <td>42</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>The Junction North, Runnymede</th>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>The Kingsway, Montgomery Road, Old Mill North</th>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Thorncliffe Park</th>\n", | |
| " <td>16</td>\n", | |
| " <td>16</td>\n", | |
| " <td>16</td>\n", | |
| " <td>16</td>\n", | |
| " <td>16</td>\n", | |
| " <td>16</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Victoria Village</th>\n", | |
| " <td>5</td>\n", | |
| " <td>5</td>\n", | |
| " <td>5</td>\n", | |
| " <td>5</td>\n", | |
| " <td>5</td>\n", | |
| " <td>5</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Westmount</th>\n", | |
| " <td>6</td>\n", | |
| " <td>6</td>\n", | |
| " <td>6</td>\n", | |
| " <td>6</td>\n", | |
| " <td>6</td>\n", | |
| " <td>6</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Weston</th>\n", | |
| " <td>2</td>\n", | |
| " <td>2</td>\n", | |
| " <td>2</td>\n", | |
| " <td>2</td>\n", | |
| " <td>2</td>\n", | |
| " <td>2</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Willowdale South</th>\n", | |
| " <td>36</td>\n", | |
| " <td>36</td>\n", | |
| " <td>36</td>\n", | |
| " <td>36</td>\n", | |
| " <td>36</td>\n", | |
| " <td>36</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Willowdale West</th>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Woburn</th>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " <td>4</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Woodbine Gardens, Parkview Hill</th>\n", | |
| " <td>13</td>\n", | |
| " <td>13</td>\n", | |
| " <td>13</td>\n", | |
| " <td>13</td>\n", | |
| " <td>13</td>\n", | |
| " <td>13</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>Woodbine Heights</th>\n", | |
| " <td>9</td>\n", | |
| " <td>9</td>\n", | |
| " <td>9</td>\n", | |
| " <td>9</td>\n", | |
| " <td>9</td>\n", | |
| " <td>9</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>York Mills West</th>\n", | |
| " <td>3</td>\n", | |
| " <td>3</td>\n", | |
| " <td>3</td>\n", | |
| " <td>3</td>\n", | |
| " <td>3</td>\n", | |
| " <td>3</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "<p>99 rows × 6 columns</p>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " Neighbourhood Latitude \\\n", | |
| "Neighbourhood \n", | |
| "Adelaide, King, Richmond 100 \n", | |
| "Agincourt 4 \n", | |
| "Agincourt North, L'Amoreaux East, Milliken, Ste... 2 \n", | |
| "Albion Gardens, Beaumond Heights, Humbergate, J... 10 \n", | |
| "Alderwood, Long Branch 10 \n", | |
| "Bathurst Manor, Downsview North, Wilson Heights 18 \n", | |
| "Bayview Village 4 \n", | |
| "Bedford Park, Lawrence Manor East 24 \n", | |
| "Berczy Park 55 \n", | |
| "Birch Cliff, Cliffside West 4 \n", | |
| "Bloordale Gardens, Eringate, Markland Wood, Old... 8 \n", | |
| "Brockton, Exhibition Place, Parkdale Village 20 \n", | |
| "Business Reply Mail Processing Centre 969 Eastern 17 \n", | |
| "CFB Toronto, Downsview East 3 \n", | |
| "CN Tower, Bathurst Quay, Island airport, Harbou... 15 \n", | |
| "Cabbagetown, St. James Town 46 \n", | |
| "Caledonia-Fairbanks 6 \n", | |
| "Canada Post Gateway Processing Centre 10 \n", | |
| "Cedarbrae 7 \n", | |
| "Central Bay Street 87 \n", | |
| "Chinatown, Grange Park, Kensington Market 100 \n", | |
| "Christie 16 \n", | |
| "Church and Wellesley 86 \n", | |
| "Clairlea, Golden Mile, Oakridge 10 \n", | |
| "Clarks Corners, Sullivan, Tam O'Shanter 10 \n", | |
| "Cliffcrest, Cliffside, Scarborough Village West 2 \n", | |
| "Cloverdale, Islington, Martin Grove, Princess G... 1 \n", | |
| "Commerce Court, Victoria Hotel 100 \n", | |
| "Davisville 36 \n", | |
| "Davisville North 6 \n", | |
| "... ... \n", | |
| "Northwest 3 \n", | |
| "Northwood Park, York University 7 \n", | |
| "Parkdale, Roncesvalles 15 \n", | |
| "Parkwoods 3 \n", | |
| "Queen's Park 39 \n", | |
| "Rosedale 4 \n", | |
| "Roselawn 2 \n", | |
| "Rouge, Malvern 1 \n", | |
| "Runnymede, Swansea 39 \n", | |
| "Ryerson, Garden District 100 \n", | |
| "Scarborough Village 1 \n", | |
| "St. James Town 100 \n", | |
| "Stn A PO Boxes 25 The Esplanade 94 \n", | |
| "Studio District 37 \n", | |
| "The Annex, North Midtown, Yorkville 23 \n", | |
| "The Beaches 5 \n", | |
| "The Beaches West, India Bazaar 21 \n", | |
| "The Danforth West, Riverdale 42 \n", | |
| "The Junction North, Runnymede 4 \n", | |
| "The Kingsway, Montgomery Road, Old Mill North 4 \n", | |
| "Thorncliffe Park 16 \n", | |
| "Victoria Village 5 \n", | |
| "Westmount 6 \n", | |
| "Weston 2 \n", | |
| "Willowdale South 36 \n", | |
| "Willowdale West 4 \n", | |
| "Woburn 4 \n", | |
| "Woodbine Gardens, Parkview Hill 13 \n", | |
| "Woodbine Heights 9 \n", | |
| "York Mills West 3 \n", | |
| "\n", | |
| " Neighbourhood Longitude \\\n", | |
| "Neighbourhood \n", | |
| "Adelaide, King, Richmond 100 \n", | |
| "Agincourt 4 \n", | |
| "Agincourt North, L'Amoreaux East, Milliken, Ste... 2 \n", | |
| "Albion Gardens, Beaumond Heights, Humbergate, J... 10 \n", | |
| "Alderwood, Long Branch 10 \n", | |
| "Bathurst Manor, Downsview North, Wilson Heights 18 \n", | |
| "Bayview Village 4 \n", | |
| "Bedford Park, Lawrence Manor East 24 \n", | |
| "Berczy Park 55 \n", | |
| "Birch Cliff, Cliffside West 4 \n", | |
| "Bloordale Gardens, Eringate, Markland Wood, Old... 8 \n", | |
| "Brockton, Exhibition Place, Parkdale Village 20 \n", | |
| "Business Reply Mail Processing Centre 969 Eastern 17 \n", | |
| "CFB Toronto, Downsview East 3 \n", | |
| "CN Tower, Bathurst Quay, Island airport, Harbou... 15 \n", | |
| "Cabbagetown, St. James Town 46 \n", | |
| "Caledonia-Fairbanks 6 \n", | |
| "Canada Post Gateway Processing Centre 10 \n", | |
| "Cedarbrae 7 \n", | |
| "Central Bay Street 87 \n", | |
| "Chinatown, Grange Park, Kensington Market 100 \n", | |
| "Christie 16 \n", | |
| "Church and Wellesley 86 \n", | |
| "Clairlea, Golden Mile, Oakridge 10 \n", | |
| "Clarks Corners, Sullivan, Tam O'Shanter 10 \n", | |
| "Cliffcrest, Cliffside, Scarborough Village West 2 \n", | |
| "Cloverdale, Islington, Martin Grove, Princess G... 1 \n", | |
| "Commerce Court, Victoria Hotel 100 \n", | |
| "Davisville 36 \n", | |
| "Davisville North 6 \n", | |
| "... ... \n", | |
| "Northwest 3 \n", | |
| "Northwood Park, York University 7 \n", | |
| "Parkdale, Roncesvalles 15 \n", | |
| "Parkwoods 3 \n", | |
| "Queen's Park 39 \n", | |
| "Rosedale 4 \n", | |
| "Roselawn 2 \n", | |
| "Rouge, Malvern 1 \n", | |
| "Runnymede, Swansea 39 \n", | |
| "Ryerson, Garden District 100 \n", | |
| "Scarborough Village 1 \n", | |
| "St. James Town 100 \n", | |
| "Stn A PO Boxes 25 The Esplanade 94 \n", | |
| "Studio District 37 \n", | |
| "The Annex, North Midtown, Yorkville 23 \n", | |
| "The Beaches 5 \n", | |
| "The Beaches West, India Bazaar 21 \n", | |
| "The Danforth West, Riverdale 42 \n", | |
| "The Junction North, Runnymede 4 \n", | |
| "The Kingsway, Montgomery Road, Old Mill North 4 \n", | |
| "Thorncliffe Park 16 \n", | |
| "Victoria Village 5 \n", | |
| "Westmount 6 \n", | |
| "Weston 2 \n", | |
| "Willowdale South 36 \n", | |
| "Willowdale West 4 \n", | |
| "Woburn 4 \n", | |
| "Woodbine Gardens, Parkview Hill 13 \n", | |
| "Woodbine Heights 9 \n", | |
| "York Mills West 3 \n", | |
| "\n", | |
| " Venue Venue Latitude \\\n", | |
| "Neighbourhood \n", | |
| "Adelaide, King, Richmond 100 100 \n", | |
| "Agincourt 4 4 \n", | |
| "Agincourt North, L'Amoreaux East, Milliken, Ste... 2 2 \n", | |
| "Albion Gardens, Beaumond Heights, Humbergate, J... 10 10 \n", | |
| "Alderwood, Long Branch 10 10 \n", | |
| "Bathurst Manor, Downsview North, Wilson Heights 18 18 \n", | |
| "Bayview Village 4 4 \n", | |
| "Bedford Park, Lawrence Manor East 24 24 \n", | |
| "Berczy Park 55 55 \n", | |
| "Birch Cliff, Cliffside West 4 4 \n", | |
| "Bloordale Gardens, Eringate, Markland Wood, Old... 8 8 \n", | |
| "Brockton, Exhibition Place, Parkdale Village 20 20 \n", | |
| "Business Reply Mail Processing Centre 969 Eastern 17 17 \n", | |
| "CFB Toronto, Downsview East 3 3 \n", | |
| "CN Tower, Bathurst Quay, Island airport, Harbou... 15 15 \n", | |
| "Cabbagetown, St. James Town 46 46 \n", | |
| "Caledonia-Fairbanks 6 6 \n", | |
| "Canada Post Gateway Processing Centre 10 10 \n", | |
| "Cedarbrae 7 7 \n", | |
| "Central Bay Street 87 87 \n", | |
| "Chinatown, Grange Park, Kensington Market 100 100 \n", | |
| "Christie 16 16 \n", | |
| "Church and Wellesley 86 86 \n", | |
| "Clairlea, Golden Mile, Oakridge 10 10 \n", | |
| "Clarks Corners, Sullivan, Tam O'Shanter 10 10 \n", | |
| "Cliffcrest, Cliffside, Scarborough Village West 2 2 \n", | |
| "Cloverdale, Islington, Martin Grove, Princess G... 1 1 \n", | |
| "Commerce Court, Victoria Hotel 100 100 \n", | |
| "Davisville 36 36 \n", | |
| "Davisville North 6 6 \n", | |
| "... ... ... \n", | |
| "Northwest 3 3 \n", | |
| "Northwood Park, York University 7 7 \n", | |
| "Parkdale, Roncesvalles 15 15 \n", | |
| "Parkwoods 3 3 \n", | |
| "Queen's Park 39 39 \n", | |
| "Rosedale 4 4 \n", | |
| "Roselawn 2 2 \n", | |
| "Rouge, Malvern 1 1 \n", | |
| "Runnymede, Swansea 39 39 \n", | |
| "Ryerson, Garden District 100 100 \n", | |
| "Scarborough Village 1 1 \n", | |
| "St. James Town 100 100 \n", | |
| "Stn A PO Boxes 25 The Esplanade 94 94 \n", | |
| "Studio District 37 37 \n", | |
| "The Annex, North Midtown, Yorkville 23 23 \n", | |
| "The Beaches 5 5 \n", | |
| "The Beaches West, India Bazaar 21 21 \n", | |
| "The Danforth West, Riverdale 42 42 \n", | |
| "The Junction North, Runnymede 4 4 \n", | |
| "The Kingsway, Montgomery Road, Old Mill North 4 4 \n", | |
| "Thorncliffe Park 16 16 \n", | |
| "Victoria Village 5 5 \n", | |
| "Westmount 6 6 \n", | |
| "Weston 2 2 \n", | |
| "Willowdale South 36 36 \n", | |
| "Willowdale West 4 4 \n", | |
| "Woburn 4 4 \n", | |
| "Woodbine Gardens, Parkview Hill 13 13 \n", | |
| "Woodbine Heights 9 9 \n", | |
| "York Mills West 3 3 \n", | |
| "\n", | |
| " Venue Longitude \\\n", | |
| "Neighbourhood \n", | |
| "Adelaide, King, Richmond 100 \n", | |
| "Agincourt 4 \n", | |
| "Agincourt North, L'Amoreaux East, Milliken, Ste... 2 \n", | |
| "Albion Gardens, Beaumond Heights, Humbergate, J... 10 \n", | |
| "Alderwood, Long Branch 10 \n", | |
| "Bathurst Manor, Downsview North, Wilson Heights 18 \n", | |
| "Bayview Village 4 \n", | |
| "Bedford Park, Lawrence Manor East 24 \n", | |
| "Berczy Park 55 \n", | |
| "Birch Cliff, Cliffside West 4 \n", | |
| "Bloordale Gardens, Eringate, Markland Wood, Old... 8 \n", | |
| "Brockton, Exhibition Place, Parkdale Village 20 \n", | |
| "Business Reply Mail Processing Centre 969 Eastern 17 \n", | |
| "CFB Toronto, Downsview East 3 \n", | |
| "CN Tower, Bathurst Quay, Island airport, Harbou... 15 \n", | |
| "Cabbagetown, St. James Town 46 \n", | |
| "Caledonia-Fairbanks 6 \n", | |
| "Canada Post Gateway Processing Centre 10 \n", | |
| "Cedarbrae 7 \n", | |
| "Central Bay Street 87 \n", | |
| "Chinatown, Grange Park, Kensington Market 100 \n", | |
| "Christie 16 \n", | |
| "Church and Wellesley 86 \n", | |
| "Clairlea, Golden Mile, Oakridge 10 \n", | |
| "Clarks Corners, Sullivan, Tam O'Shanter 10 \n", | |
| "Cliffcrest, Cliffside, Scarborough Village West 2 \n", | |
| "Cloverdale, Islington, Martin Grove, Princess G... 1 \n", | |
| "Commerce Court, Victoria Hotel 100 \n", | |
| "Davisville 36 \n", | |
| "Davisville North 6 \n", | |
| "... ... \n", | |
| "Northwest 3 \n", | |
| "Northwood Park, York University 7 \n", | |
| "Parkdale, Roncesvalles 15 \n", | |
| "Parkwoods 3 \n", | |
| "Queen's Park 39 \n", | |
| "Rosedale 4 \n", | |
| "Roselawn 2 \n", | |
| "Rouge, Malvern 1 \n", | |
| "Runnymede, Swansea 39 \n", | |
| "Ryerson, Garden District 100 \n", | |
| "Scarborough Village 1 \n", | |
| "St. James Town 100 \n", | |
| "Stn A PO Boxes 25 The Esplanade 94 \n", | |
| "Studio District 37 \n", | |
| "The Annex, North Midtown, Yorkville 23 \n", | |
| "The Beaches 5 \n", | |
| "The Beaches West, India Bazaar 21 \n", | |
| "The Danforth West, Riverdale 42 \n", | |
| "The Junction North, Runnymede 4 \n", | |
| "The Kingsway, Montgomery Road, Old Mill North 4 \n", | |
| "Thorncliffe Park 16 \n", | |
| "Victoria Village 5 \n", | |
| "Westmount 6 \n", | |
| "Weston 2 \n", | |
| "Willowdale South 36 \n", | |
| "Willowdale West 4 \n", | |
| "Woburn 4 \n", | |
| "Woodbine Gardens, Parkview Hill 13 \n", | |
| "Woodbine Heights 9 \n", | |
| "York Mills West 3 \n", | |
| "\n", | |
| " Venue Category \n", | |
| "Neighbourhood \n", | |
| "Adelaide, King, Richmond 100 \n", | |
| "Agincourt 4 \n", | |
| "Agincourt North, L'Amoreaux East, Milliken, Ste... 2 \n", | |
| "Albion Gardens, Beaumond Heights, Humbergate, J... 10 \n", | |
| "Alderwood, Long Branch 10 \n", | |
| "Bathurst Manor, Downsview North, Wilson Heights 18 \n", | |
| "Bayview Village 4 \n", | |
| "Bedford Park, Lawrence Manor East 24 \n", | |
| "Berczy Park 55 \n", | |
| "Birch Cliff, Cliffside West 4 \n", | |
| "Bloordale Gardens, Eringate, Markland Wood, Old... 8 \n", | |
| "Brockton, Exhibition Place, Parkdale Village 20 \n", | |
| "Business Reply Mail Processing Centre 969 Eastern 17 \n", | |
| "CFB Toronto, Downsview East 3 \n", | |
| "CN Tower, Bathurst Quay, Island airport, Harbou... 15 \n", | |
| "Cabbagetown, St. James Town 46 \n", | |
| "Caledonia-Fairbanks 6 \n", | |
| "Canada Post Gateway Processing Centre 10 \n", | |
| "Cedarbrae 7 \n", | |
| "Central Bay Street 87 \n", | |
| "Chinatown, Grange Park, Kensington Market 100 \n", | |
| "Christie 16 \n", | |
| "Church and Wellesley 86 \n", | |
| "Clairlea, Golden Mile, Oakridge 10 \n", | |
| "Clarks Corners, Sullivan, Tam O'Shanter 10 \n", | |
| "Cliffcrest, Cliffside, Scarborough Village West 2 \n", | |
| "Cloverdale, Islington, Martin Grove, Princess G... 1 \n", | |
| "Commerce Court, Victoria Hotel 100 \n", | |
| "Davisville 36 \n", | |
| "Davisville North 6 \n", | |
| "... ... \n", | |
| "Northwest 3 \n", | |
| "Northwood Park, York University 7 \n", | |
| "Parkdale, Roncesvalles 15 \n", | |
| "Parkwoods 3 \n", | |
| "Queen's Park 39 \n", | |
| "Rosedale 4 \n", | |
| "Roselawn 2 \n", | |
| "Rouge, Malvern 1 \n", | |
| "Runnymede, Swansea 39 \n", | |
| "Ryerson, Garden District 100 \n", | |
| "Scarborough Village 1 \n", | |
| "St. James Town 100 \n", | |
| "Stn A PO Boxes 25 The Esplanade 94 \n", | |
| "Studio District 37 \n", | |
| "The Annex, North Midtown, Yorkville 23 \n", | |
| "The Beaches 5 \n", | |
| "The Beaches West, India Bazaar 21 \n", | |
| "The Danforth West, Riverdale 42 \n", | |
| "The Junction North, Runnymede 4 \n", | |
| "The Kingsway, Montgomery Road, Old Mill North 4 \n", | |
| "Thorncliffe Park 16 \n", | |
| "Victoria Village 5 \n", | |
| "Westmount 6 \n", | |
| "Weston 2 \n", | |
| "Willowdale South 36 \n", | |
| "Willowdale West 4 \n", | |
| "Woburn 4 \n", | |
| "Woodbine Gardens, Parkview Hill 13 \n", | |
| "Woodbine Heights 9 \n", | |
| "York Mills West 3 \n", | |
| "\n", | |
| "[99 rows x 6 columns]" | |
| ] | |
| }, | |
| "execution_count": 42, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "# How many venues were returned for each neighborhood\n", | |
| "toronto_venues.groupby('Neighbourhood').count()\n", | |
| "\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 44, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<div>\n", | |
| "<style scoped>\n", | |
| " .dataframe tbody tr th:only-of-type {\n", | |
| " vertical-align: middle;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe tbody tr th {\n", | |
| " vertical-align: top;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe thead th {\n", | |
| " text-align: right;\n", | |
| " }\n", | |
| "</style>\n", | |
| "<table border=\"1\" class=\"dataframe\">\n", | |
| " <thead>\n", | |
| " <tr style=\"text-align: right;\">\n", | |
| " <th></th>\n", | |
| " <th>Accessories Store</th>\n", | |
| " <th>Adult Boutique</th>\n", | |
| " <th>Afghan Restaurant</th>\n", | |
| " <th>Airport</th>\n", | |
| " <th>Airport Food Court</th>\n", | |
| " <th>Airport Gate</th>\n", | |
| " <th>Airport Lounge</th>\n", | |
| " <th>Airport Service</th>\n", | |
| " <th>Airport Terminal</th>\n", | |
| " <th>American Restaurant</th>\n", | |
| " <th>...</th>\n", | |
| " <th>Vegetarian / Vegan Restaurant</th>\n", | |
| " <th>Video Game Store</th>\n", | |
| " <th>Video Store</th>\n", | |
| " <th>Vietnamese Restaurant</th>\n", | |
| " <th>Warehouse Store</th>\n", | |
| " <th>Wine Bar</th>\n", | |
| " <th>Wings Joint</th>\n", | |
| " <th>Women's Store</th>\n", | |
| " <th>Yoga Studio</th>\n", | |
| " <th>Neighbourhood</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>0</th>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Parkwoods</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>1</th>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Parkwoods</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>2</th>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Parkwoods</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>3</th>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Victoria Village</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>4</th>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Victoria Village</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>5</th>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Victoria Village</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>6</th>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Victoria Village</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>7</th>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Victoria Village</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>8</th>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Harbourfront, Regent Park</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>9</th>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Harbourfront, Regent Park</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "<p>10 rows × 279 columns</p>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " Accessories Store Adult Boutique Afghan Restaurant Airport \\\n", | |
| "0 0 0 0 0 \n", | |
| "1 0 0 0 0 \n", | |
| "2 0 0 0 0 \n", | |
| "3 0 0 0 0 \n", | |
| "4 0 0 0 0 \n", | |
| "5 0 0 0 0 \n", | |
| "6 0 0 0 0 \n", | |
| "7 0 0 0 0 \n", | |
| "8 0 0 0 0 \n", | |
| "9 0 0 0 0 \n", | |
| "\n", | |
| " Airport Food Court Airport Gate Airport Lounge Airport Service \\\n", | |
| "0 0 0 0 0 \n", | |
| "1 0 0 0 0 \n", | |
| "2 0 0 0 0 \n", | |
| "3 0 0 0 0 \n", | |
| "4 0 0 0 0 \n", | |
| "5 0 0 0 0 \n", | |
| "6 0 0 0 0 \n", | |
| "7 0 0 0 0 \n", | |
| "8 0 0 0 0 \n", | |
| "9 0 0 0 0 \n", | |
| "\n", | |
| " Airport Terminal American Restaurant ... Vegetarian / Vegan Restaurant \\\n", | |
| "0 0 0 ... 0 \n", | |
| "1 0 0 ... 0 \n", | |
| "2 0 0 ... 0 \n", | |
| "3 0 0 ... 0 \n", | |
| "4 0 0 ... 0 \n", | |
| "5 0 0 ... 0 \n", | |
| "6 0 0 ... 0 \n", | |
| "7 0 0 ... 0 \n", | |
| "8 0 0 ... 0 \n", | |
| "9 0 0 ... 0 \n", | |
| "\n", | |
| " Video Game Store Video Store Vietnamese Restaurant Warehouse Store \\\n", | |
| "0 0 0 0 0 \n", | |
| "1 0 0 0 0 \n", | |
| "2 0 0 0 0 \n", | |
| "3 0 0 0 0 \n", | |
| "4 0 0 0 0 \n", | |
| "5 0 0 0 0 \n", | |
| "6 0 0 0 0 \n", | |
| "7 0 0 0 0 \n", | |
| "8 0 0 0 0 \n", | |
| "9 0 0 0 0 \n", | |
| "\n", | |
| " Wine Bar Wings Joint Women's Store Yoga Studio \\\n", | |
| "0 0 0 0 0 \n", | |
| "1 0 0 0 0 \n", | |
| "2 0 0 0 0 \n", | |
| "3 0 0 0 0 \n", | |
| "4 0 0 0 0 \n", | |
| "5 0 0 0 0 \n", | |
| "6 0 0 0 0 \n", | |
| "7 0 0 0 0 \n", | |
| "8 0 0 0 0 \n", | |
| "9 0 0 0 0 \n", | |
| "\n", | |
| " Neighbourhood \n", | |
| "0 Parkwoods \n", | |
| "1 Parkwoods \n", | |
| "2 Parkwoods \n", | |
| "3 Victoria Village \n", | |
| "4 Victoria Village \n", | |
| "5 Victoria Village \n", | |
| "6 Victoria Village \n", | |
| "7 Victoria Village \n", | |
| "8 Harbourfront, Regent Park \n", | |
| "9 Harbourfront, Regent Park \n", | |
| "\n", | |
| "[10 rows x 279 columns]" | |
| ] | |
| }, | |
| "execution_count": 44, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "# one hot encoding\n", | |
| "toronto_onehot = pd.get_dummies(toronto_venues[['Venue Category']], prefix=\"\", prefix_sep=\"\")\n", | |
| "\n", | |
| "# add neighborhood column back to dataframe\n", | |
| "toronto_onehot['Neighbourhood'] = toronto_venues['Neighbourhood'] \n", | |
| "\n", | |
| "# move neighborhood column to the first column\n", | |
| "fixed_columns = [toronto_onehot.columns[-1]] + list(toronto_onehot.columns[:-1])\n", | |
| "toronto_onehot.head(10)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 45, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "(2246, 279)" | |
| ] | |
| }, | |
| "execution_count": 45, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "toronto_onehot.shape" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 46, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<div>\n", | |
| "<style scoped>\n", | |
| " .dataframe tbody tr th:only-of-type {\n", | |
| " vertical-align: middle;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe tbody tr th {\n", | |
| " vertical-align: top;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe thead th {\n", | |
| " text-align: right;\n", | |
| " }\n", | |
| "</style>\n", | |
| "<table border=\"1\" class=\"dataframe\">\n", | |
| " <thead>\n", | |
| " <tr style=\"text-align: right;\">\n", | |
| " <th></th>\n", | |
| " <th>Neighbourhood</th>\n", | |
| " <th>Accessories Store</th>\n", | |
| " <th>Adult Boutique</th>\n", | |
| " <th>Afghan Restaurant</th>\n", | |
| " <th>Airport</th>\n", | |
| " <th>Airport Food Court</th>\n", | |
| " <th>Airport Gate</th>\n", | |
| " <th>Airport Lounge</th>\n", | |
| " <th>Airport Service</th>\n", | |
| " <th>Airport Terminal</th>\n", | |
| " <th>...</th>\n", | |
| " <th>Turkish Restaurant</th>\n", | |
| " <th>Vegetarian / Vegan Restaurant</th>\n", | |
| " <th>Video Game Store</th>\n", | |
| " <th>Video Store</th>\n", | |
| " <th>Vietnamese Restaurant</th>\n", | |
| " <th>Warehouse Store</th>\n", | |
| " <th>Wine Bar</th>\n", | |
| " <th>Wings Joint</th>\n", | |
| " <th>Women's Store</th>\n", | |
| " <th>Yoga Studio</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>0</th>\n", | |
| " <td>Adelaide, King, Richmond</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.010000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.010000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>1</th>\n", | |
| " <td>Agincourt</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>2</th>\n", | |
| " <td>Agincourt North, L'Amoreaux East, Milliken, St...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>3</th>\n", | |
| " <td>Albion Gardens, Beaumond Heights, Humbergate, ...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.100000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>4</th>\n", | |
| " <td>Alderwood, Long Branch</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>5</th>\n", | |
| " <td>Bathurst Manor, Downsview North, Wilson Heights</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.055556</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>6</th>\n", | |
| " <td>Bayview Village</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>7</th>\n", | |
| " <td>Bedford Park, Lawrence Manor East</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>8</th>\n", | |
| " <td>Berczy Park</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.018182</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>9</th>\n", | |
| " <td>Birch Cliff, Cliffside West</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>10</th>\n", | |
| " <td>Bloordale Gardens, Eringate, Markland Wood, Ol...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>11</th>\n", | |
| " <td>Brockton, Exhibition Place, Parkdale Village</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>12</th>\n", | |
| " <td>Business Reply Mail Processing Centre 969 Eastern</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>13</th>\n", | |
| " <td>CFB Toronto, Downsview East</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.333333</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>14</th>\n", | |
| " <td>CN Tower, Bathurst Quay, Island airport, Harbo...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.066667</td>\n", | |
| " <td>0.066667</td>\n", | |
| " <td>0.066667</td>\n", | |
| " <td>0.133333</td>\n", | |
| " <td>0.2</td>\n", | |
| " <td>0.133333</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>15</th>\n", | |
| " <td>Cabbagetown, St. James Town</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>16</th>\n", | |
| " <td>Caledonia-Fairbanks</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.166667</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>17</th>\n", | |
| " <td>Canada Post Gateway Processing Centre</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>18</th>\n", | |
| " <td>Cedarbrae</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>19</th>\n", | |
| " <td>Central Bay Street</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.011494</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.011494</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.011494</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>20</th>\n", | |
| " <td>Chinatown, Grange Park, Kensington Market</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.060000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.030000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.010000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>21</th>\n", | |
| " <td>Christie</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>22</th>\n", | |
| " <td>Church and Wellesley</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.011628</td>\n", | |
| " <td>0.011628</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.011628</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.011628</td>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.011628</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.011628</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>23</th>\n", | |
| " <td>Clairlea, Golden Mile, Oakridge</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>24</th>\n", | |
| " <td>Clarks Corners, Sullivan, Tam O'Shanter</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>25</th>\n", | |
| " <td>Cliffcrest, Cliffside, Scarborough Village West</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>26</th>\n", | |
| " <td>Cloverdale, Islington, Martin Grove, Princess ...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>27</th>\n", | |
| " <td>Commerce Court, Victoria Hotel</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.010000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.010000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>28</th>\n", | |
| " <td>Davisville</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>29</th>\n", | |
| " <td>Davisville North</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>...</th>\n", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>69</th>\n", | |
| " <td>Northwest</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>70</th>\n", | |
| " <td>Northwood Park, York University</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>71</th>\n", | |
| " <td>Parkdale, Roncesvalles</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>72</th>\n", | |
| " <td>Parkwoods</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>73</th>\n", | |
| " <td>Queen's Park</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.025641</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.025641</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>74</th>\n", | |
| " <td>Rosedale</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>75</th>\n", | |
| " <td>Roselawn</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>76</th>\n", | |
| " <td>Rouge, Malvern</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>77</th>\n", | |
| " <td>Runnymede, Swansea</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.025641</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>78</th>\n", | |
| " <td>Ryerson, Garden District</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.010000</td>\n", | |
| " <td>0.010000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.010000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.010000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>79</th>\n", | |
| " <td>Scarborough Village</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>80</th>\n", | |
| " <td>St. James Town</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.010000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.010000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>81</th>\n", | |
| " <td>Stn A PO Boxes 25 The Esplanade</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.010638</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>82</th>\n", | |
| " <td>Studio District</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.027027</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>83</th>\n", | |
| " <td>The Annex, North Midtown, Yorkville</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.043478</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>84</th>\n", | |
| " <td>The Beaches</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>85</th>\n", | |
| " <td>The Beaches West, India Bazaar</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>86</th>\n", | |
| " <td>The Danforth West, Riverdale</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.023810</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>87</th>\n", | |
| " <td>The Junction North, Runnymede</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>88</th>\n", | |
| " <td>The Kingsway, Montgomery Road, Old Mill North</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>89</th>\n", | |
| " <td>Thorncliffe Park</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0625</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.062500</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>90</th>\n", | |
| " <td>Victoria Village</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>91</th>\n", | |
| " <td>Westmount</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>92</th>\n", | |
| " <td>Weston</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>93</th>\n", | |
| " <td>Willowdale South</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.027778</td>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>94</th>\n", | |
| " <td>Willowdale West</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>95</th>\n", | |
| " <td>Woburn</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>96</th>\n", | |
| " <td>Woodbine Gardens, Parkview Hill</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>97</th>\n", | |
| " <td>Woodbine Heights</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.111111</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>98</th>\n", | |
| " <td>York Mills West</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>...</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.0000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " <td>0.000000</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "<p>99 rows × 279 columns</p>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " Neighbourhood Accessories Store \\\n", | |
| "0 Adelaide, King, Richmond 0.0 \n", | |
| "1 Agincourt 0.0 \n", | |
| "2 Agincourt North, L'Amoreaux East, Milliken, St... 0.0 \n", | |
| "3 Albion Gardens, Beaumond Heights, Humbergate, ... 0.0 \n", | |
| "4 Alderwood, Long Branch 0.0 \n", | |
| "5 Bathurst Manor, Downsview North, Wilson Heights 0.0 \n", | |
| "6 Bayview Village 0.0 \n", | |
| "7 Bedford Park, Lawrence Manor East 0.0 \n", | |
| "8 Berczy Park 0.0 \n", | |
| "9 Birch Cliff, Cliffside West 0.0 \n", | |
| "10 Bloordale Gardens, Eringate, Markland Wood, Ol... 0.0 \n", | |
| "11 Brockton, Exhibition Place, Parkdale Village 0.0 \n", | |
| "12 Business Reply Mail Processing Centre 969 Eastern 0.0 \n", | |
| "13 CFB Toronto, Downsview East 0.0 \n", | |
| "14 CN Tower, Bathurst Quay, Island airport, Harbo... 0.0 \n", | |
| "15 Cabbagetown, St. James Town 0.0 \n", | |
| "16 Caledonia-Fairbanks 0.0 \n", | |
| "17 Canada Post Gateway Processing Centre 0.0 \n", | |
| "18 Cedarbrae 0.0 \n", | |
| "19 Central Bay Street 0.0 \n", | |
| "20 Chinatown, Grange Park, Kensington Market 0.0 \n", | |
| "21 Christie 0.0 \n", | |
| "22 Church and Wellesley 0.0 \n", | |
| "23 Clairlea, Golden Mile, Oakridge 0.0 \n", | |
| "24 Clarks Corners, Sullivan, Tam O'Shanter 0.0 \n", | |
| "25 Cliffcrest, Cliffside, Scarborough Village West 0.0 \n", | |
| "26 Cloverdale, Islington, Martin Grove, Princess ... 0.0 \n", | |
| "27 Commerce Court, Victoria Hotel 0.0 \n", | |
| "28 Davisville 0.0 \n", | |
| "29 Davisville North 0.0 \n", | |
| ".. ... ... \n", | |
| "69 Northwest 0.0 \n", | |
| "70 Northwood Park, York University 0.0 \n", | |
| "71 Parkdale, Roncesvalles 0.0 \n", | |
| "72 Parkwoods 0.0 \n", | |
| "73 Queen's Park 0.0 \n", | |
| "74 Rosedale 0.0 \n", | |
| "75 Roselawn 0.0 \n", | |
| "76 Rouge, Malvern 0.0 \n", | |
| "77 Runnymede, Swansea 0.0 \n", | |
| "78 Ryerson, Garden District 0.0 \n", | |
| "79 Scarborough Village 0.0 \n", | |
| "80 St. James Town 0.0 \n", | |
| "81 Stn A PO Boxes 25 The Esplanade 0.0 \n", | |
| "82 Studio District 0.0 \n", | |
| "83 The Annex, North Midtown, Yorkville 0.0 \n", | |
| "84 The Beaches 0.0 \n", | |
| "85 The Beaches West, India Bazaar 0.0 \n", | |
| "86 The Danforth West, Riverdale 0.0 \n", | |
| "87 The Junction North, Runnymede 0.0 \n", | |
| "88 The Kingsway, Montgomery Road, Old Mill North 0.0 \n", | |
| "89 Thorncliffe Park 0.0 \n", | |
| "90 Victoria Village 0.0 \n", | |
| "91 Westmount 0.0 \n", | |
| "92 Weston 0.0 \n", | |
| "93 Willowdale South 0.0 \n", | |
| "94 Willowdale West 0.0 \n", | |
| "95 Woburn 0.0 \n", | |
| "96 Woodbine Gardens, Parkview Hill 0.0 \n", | |
| "97 Woodbine Heights 0.0 \n", | |
| "98 York Mills West 0.0 \n", | |
| "\n", | |
| " Adult Boutique Afghan Restaurant Airport Airport Food Court \\\n", | |
| "0 0.000000 0.000000 0.000000 0.000000 \n", | |
| "1 0.000000 0.000000 0.000000 0.000000 \n", | |
| "2 0.000000 0.000000 0.000000 0.000000 \n", | |
| "3 0.000000 0.000000 0.000000 0.000000 \n", | |
| "4 0.000000 0.000000 0.000000 0.000000 \n", | |
| "5 0.000000 0.000000 0.000000 0.000000 \n", | |
| "6 0.000000 0.000000 0.000000 0.000000 \n", | |
| "7 0.000000 0.000000 0.000000 0.000000 \n", | |
| "8 0.000000 0.000000 0.000000 0.000000 \n", | |
| "9 0.000000 0.000000 0.000000 0.000000 \n", | |
| "10 0.000000 0.000000 0.000000 0.000000 \n", | |
| "11 0.000000 0.000000 0.000000 0.000000 \n", | |
| "12 0.000000 0.000000 0.000000 0.000000 \n", | |
| "13 0.000000 0.000000 0.333333 0.000000 \n", | |
| "14 0.000000 0.000000 0.066667 0.066667 \n", | |
| "15 0.000000 0.000000 0.000000 0.000000 \n", | |
| "16 0.000000 0.000000 0.000000 0.000000 \n", | |
| "17 0.000000 0.000000 0.000000 0.000000 \n", | |
| "18 0.000000 0.000000 0.000000 0.000000 \n", | |
| "19 0.000000 0.000000 0.000000 0.000000 \n", | |
| "20 0.000000 0.000000 0.000000 0.000000 \n", | |
| "21 0.000000 0.000000 0.000000 0.000000 \n", | |
| "22 0.011628 0.011628 0.000000 0.000000 \n", | |
| "23 0.000000 0.000000 0.000000 0.000000 \n", | |
| "24 0.000000 0.000000 0.000000 0.000000 \n", | |
| "25 0.000000 0.000000 0.000000 0.000000 \n", | |
| "26 0.000000 0.000000 0.000000 0.000000 \n", | |
| "27 0.000000 0.000000 0.000000 0.000000 \n", | |
| "28 0.000000 0.000000 0.000000 0.000000 \n", | |
| "29 0.000000 0.000000 0.000000 0.000000 \n", | |
| ".. ... ... ... ... \n", | |
| "69 0.000000 0.000000 0.000000 0.000000 \n", | |
| "70 0.000000 0.000000 0.000000 0.000000 \n", | |
| "71 0.000000 0.000000 0.000000 0.000000 \n", | |
| "72 0.000000 0.000000 0.000000 0.000000 \n", | |
| "73 0.000000 0.000000 0.000000 0.000000 \n", | |
| "74 0.000000 0.000000 0.000000 0.000000 \n", | |
| "75 0.000000 0.000000 0.000000 0.000000 \n", | |
| "76 0.000000 0.000000 0.000000 0.000000 \n", | |
| "77 0.000000 0.000000 0.000000 0.000000 \n", | |
| "78 0.000000 0.000000 0.000000 0.000000 \n", | |
| "79 0.000000 0.000000 0.000000 0.000000 \n", | |
| "80 0.000000 0.000000 0.000000 0.000000 \n", | |
| "81 0.000000 0.000000 0.000000 0.000000 \n", | |
| "82 0.000000 0.000000 0.000000 0.000000 \n", | |
| "83 0.000000 0.000000 0.000000 0.000000 \n", | |
| "84 0.000000 0.000000 0.000000 0.000000 \n", | |
| "85 0.000000 0.000000 0.000000 0.000000 \n", | |
| "86 0.000000 0.000000 0.000000 0.000000 \n", | |
| "87 0.000000 0.000000 0.000000 0.000000 \n", | |
| "88 0.000000 0.000000 0.000000 0.000000 \n", | |
| "89 0.000000 0.000000 0.000000 0.000000 \n", | |
| "90 0.000000 0.000000 0.000000 0.000000 \n", | |
| "91 0.000000 0.000000 0.000000 0.000000 \n", | |
| "92 0.000000 0.000000 0.000000 0.000000 \n", | |
| "93 0.000000 0.000000 0.000000 0.000000 \n", | |
| "94 0.000000 0.000000 0.000000 0.000000 \n", | |
| "95 0.000000 0.000000 0.000000 0.000000 \n", | |
| "96 0.000000 0.000000 0.000000 0.000000 \n", | |
| "97 0.000000 0.000000 0.000000 0.000000 \n", | |
| "98 0.000000 0.000000 0.000000 0.000000 \n", | |
| "\n", | |
| " Airport Gate Airport Lounge Airport Service Airport Terminal ... \\\n", | |
| "0 0.000000 0.000000 0.0 0.000000 ... \n", | |
| "1 0.000000 0.000000 0.0 0.000000 ... \n", | |
| "2 0.000000 0.000000 0.0 0.000000 ... \n", | |
| "3 0.000000 0.000000 0.0 0.000000 ... \n", | |
| "4 0.000000 0.000000 0.0 0.000000 ... \n", | |
| "5 0.000000 0.000000 0.0 0.000000 ... \n", | |
| "6 0.000000 0.000000 0.0 0.000000 ... \n", | |
| "7 0.000000 0.000000 0.0 0.000000 ... \n", | |
| "8 0.000000 0.000000 0.0 0.000000 ... \n", | |
| "9 0.000000 0.000000 0.0 0.000000 ... \n", | |
| "10 0.000000 0.000000 0.0 0.000000 ... \n", | |
| "11 0.000000 0.000000 0.0 0.000000 ... \n", | |
| "12 0.000000 0.000000 0.0 0.000000 ... \n", | |
| "13 0.000000 0.000000 0.0 0.000000 ... \n", | |
| "14 0.066667 0.133333 0.2 0.133333 ... \n", | |
| "15 0.000000 0.000000 0.0 0.000000 ... \n", | |
| "16 0.000000 0.000000 0.0 0.000000 ... \n", | |
| "17 0.000000 0.000000 0.0 0.000000 ... \n", | |
| "18 0.000000 0.000000 0.0 0.000000 ... \n", | |
| "19 0.000000 0.000000 0.0 0.000000 ... \n", | |
| "20 0.000000 0.000000 0.0 0.000000 ... \n", | |
| "21 0.000000 0.000000 0.0 0.000000 ... \n", | |
| "22 0.000000 0.000000 0.0 0.000000 ... \n", | |
| "23 0.000000 0.000000 0.0 0.000000 ... \n", | |
| "24 0.000000 0.000000 0.0 0.000000 ... \n", | |
| "25 0.000000 0.000000 0.0 0.000000 ... \n", | |
| "26 0.000000 0.000000 0.0 0.000000 ... \n", | |
| "27 0.000000 0.000000 0.0 0.000000 ... \n", | |
| "28 0.000000 0.000000 0.0 0.000000 ... \n", | |
| "29 0.000000 0.000000 0.0 0.000000 ... \n", | |
| ".. ... ... ... ... ... \n", | |
| "69 0.000000 0.000000 0.0 0.000000 ... \n", | |
| "70 0.000000 0.000000 0.0 0.000000 ... \n", | |
| "71 0.000000 0.000000 0.0 0.000000 ... \n", | |
| "72 0.000000 0.000000 0.0 0.000000 ... \n", | |
| "73 0.000000 0.000000 0.0 0.000000 ... \n", | |
| "74 0.000000 0.000000 0.0 0.000000 ... \n", | |
| "75 0.000000 0.000000 0.0 0.000000 ... \n", | |
| "76 0.000000 0.000000 0.0 0.000000 ... \n", | |
| "77 0.000000 0.000000 0.0 0.000000 ... \n", | |
| "78 0.000000 0.000000 0.0 0.000000 ... \n", | |
| "79 0.000000 0.000000 0.0 0.000000 ... \n", | |
| "80 0.000000 0.000000 0.0 0.000000 ... \n", | |
| "81 0.000000 0.000000 0.0 0.000000 ... \n", | |
| "82 0.000000 0.000000 0.0 0.000000 ... \n", | |
| "83 0.000000 0.000000 0.0 0.000000 ... \n", | |
| "84 0.000000 0.000000 0.0 0.000000 ... \n", | |
| "85 0.000000 0.000000 0.0 0.000000 ... \n", | |
| "86 0.000000 0.000000 0.0 0.000000 ... \n", | |
| "87 0.000000 0.000000 0.0 0.000000 ... \n", | |
| "88 0.000000 0.000000 0.0 0.000000 ... \n", | |
| "89 0.000000 0.000000 0.0 0.000000 ... \n", | |
| "90 0.000000 0.000000 0.0 0.000000 ... \n", | |
| "91 0.000000 0.000000 0.0 0.000000 ... \n", | |
| "92 0.000000 0.000000 0.0 0.000000 ... \n", | |
| "93 0.000000 0.000000 0.0 0.000000 ... \n", | |
| "94 0.000000 0.000000 0.0 0.000000 ... \n", | |
| "95 0.000000 0.000000 0.0 0.000000 ... \n", | |
| "96 0.000000 0.000000 0.0 0.000000 ... \n", | |
| "97 0.000000 0.000000 0.0 0.000000 ... \n", | |
| "98 0.000000 0.000000 0.0 0.000000 ... \n", | |
| "\n", | |
| " Turkish Restaurant Vegetarian / Vegan Restaurant Video Game Store \\\n", | |
| "0 0.0 0.010000 0.000000 \n", | |
| "1 0.0 0.000000 0.000000 \n", | |
| "2 0.0 0.000000 0.000000 \n", | |
| "3 0.0 0.000000 0.000000 \n", | |
| "4 0.0 0.000000 0.000000 \n", | |
| "5 0.0 0.000000 0.000000 \n", | |
| "6 0.0 0.000000 0.000000 \n", | |
| "7 0.0 0.000000 0.000000 \n", | |
| "8 0.0 0.018182 0.000000 \n", | |
| "9 0.0 0.000000 0.000000 \n", | |
| "10 0.0 0.000000 0.000000 \n", | |
| "11 0.0 0.000000 0.000000 \n", | |
| "12 0.0 0.000000 0.000000 \n", | |
| "13 0.0 0.000000 0.000000 \n", | |
| "14 0.0 0.000000 0.000000 \n", | |
| "15 0.0 0.000000 0.000000 \n", | |
| "16 0.0 0.000000 0.000000 \n", | |
| "17 0.0 0.000000 0.000000 \n", | |
| "18 0.0 0.000000 0.000000 \n", | |
| "19 0.0 0.011494 0.000000 \n", | |
| "20 0.0 0.060000 0.000000 \n", | |
| "21 0.0 0.000000 0.000000 \n", | |
| "22 0.0 0.000000 0.011628 \n", | |
| "23 0.0 0.000000 0.000000 \n", | |
| "24 0.0 0.000000 0.000000 \n", | |
| "25 0.0 0.000000 0.000000 \n", | |
| "26 0.0 0.000000 0.000000 \n", | |
| "27 0.0 0.010000 0.000000 \n", | |
| "28 0.0 0.000000 0.000000 \n", | |
| "29 0.0 0.000000 0.000000 \n", | |
| ".. ... ... ... \n", | |
| "69 0.0 0.000000 0.000000 \n", | |
| "70 0.0 0.000000 0.000000 \n", | |
| "71 0.0 0.000000 0.000000 \n", | |
| "72 0.0 0.000000 0.000000 \n", | |
| "73 0.0 0.000000 0.000000 \n", | |
| "74 0.0 0.000000 0.000000 \n", | |
| "75 0.0 0.000000 0.000000 \n", | |
| "76 0.0 0.000000 0.000000 \n", | |
| "77 0.0 0.025641 0.000000 \n", | |
| "78 0.0 0.010000 0.010000 \n", | |
| "79 0.0 0.000000 0.000000 \n", | |
| "80 0.0 0.010000 0.000000 \n", | |
| "81 0.0 0.010638 0.000000 \n", | |
| "82 0.0 0.000000 0.000000 \n", | |
| "83 0.0 0.043478 0.000000 \n", | |
| "84 0.0 0.000000 0.000000 \n", | |
| "85 0.0 0.000000 0.000000 \n", | |
| "86 0.0 0.000000 0.000000 \n", | |
| "87 0.0 0.000000 0.000000 \n", | |
| "88 0.0 0.000000 0.000000 \n", | |
| "89 0.0 0.000000 0.000000 \n", | |
| "90 0.0 0.000000 0.000000 \n", | |
| "91 0.0 0.000000 0.000000 \n", | |
| "92 0.0 0.000000 0.000000 \n", | |
| "93 0.0 0.000000 0.000000 \n", | |
| "94 0.0 0.000000 0.000000 \n", | |
| "95 0.0 0.000000 0.000000 \n", | |
| "96 0.0 0.000000 0.000000 \n", | |
| "97 0.0 0.000000 0.000000 \n", | |
| "98 0.0 0.000000 0.000000 \n", | |
| "\n", | |
| " Video Store Vietnamese Restaurant Warehouse Store Wine Bar \\\n", | |
| "0 0.000000 0.000000 0.0000 0.010000 \n", | |
| "1 0.000000 0.000000 0.0000 0.000000 \n", | |
| "2 0.000000 0.000000 0.0000 0.000000 \n", | |
| "3 0.100000 0.000000 0.0000 0.000000 \n", | |
| "4 0.000000 0.000000 0.0000 0.000000 \n", | |
| "5 0.055556 0.000000 0.0000 0.000000 \n", | |
| "6 0.000000 0.000000 0.0000 0.000000 \n", | |
| "7 0.000000 0.000000 0.0000 0.000000 \n", | |
| "8 0.000000 0.000000 0.0000 0.000000 \n", | |
| "9 0.000000 0.000000 0.0000 0.000000 \n", | |
| "10 0.000000 0.000000 0.0000 0.000000 \n", | |
| "11 0.000000 0.000000 0.0000 0.000000 \n", | |
| "12 0.000000 0.000000 0.0000 0.000000 \n", | |
| "13 0.000000 0.000000 0.0000 0.000000 \n", | |
| "14 0.000000 0.000000 0.0000 0.000000 \n", | |
| "15 0.000000 0.000000 0.0000 0.000000 \n", | |
| "16 0.000000 0.000000 0.0000 0.000000 \n", | |
| "17 0.000000 0.000000 0.0000 0.000000 \n", | |
| "18 0.000000 0.000000 0.0000 0.000000 \n", | |
| "19 0.000000 0.000000 0.0000 0.011494 \n", | |
| "20 0.000000 0.030000 0.0000 0.010000 \n", | |
| "21 0.000000 0.000000 0.0000 0.000000 \n", | |
| "22 0.000000 0.011628 0.0000 0.000000 \n", | |
| "23 0.000000 0.000000 0.0000 0.000000 \n", | |
| "24 0.000000 0.000000 0.0000 0.000000 \n", | |
| "25 0.000000 0.000000 0.0000 0.000000 \n", | |
| "26 0.000000 0.000000 0.0000 0.000000 \n", | |
| "27 0.000000 0.000000 0.0000 0.010000 \n", | |
| "28 0.000000 0.000000 0.0000 0.000000 \n", | |
| "29 0.000000 0.000000 0.0000 0.000000 \n", | |
| ".. ... ... ... ... \n", | |
| "69 0.000000 0.000000 0.0000 0.000000 \n", | |
| "70 0.000000 0.000000 0.0000 0.000000 \n", | |
| "71 0.000000 0.000000 0.0000 0.000000 \n", | |
| "72 0.000000 0.000000 0.0000 0.000000 \n", | |
| "73 0.000000 0.000000 0.0000 0.000000 \n", | |
| "74 0.000000 0.000000 0.0000 0.000000 \n", | |
| "75 0.000000 0.000000 0.0000 0.000000 \n", | |
| "76 0.000000 0.000000 0.0000 0.000000 \n", | |
| "77 0.000000 0.000000 0.0000 0.000000 \n", | |
| "78 0.000000 0.010000 0.0000 0.010000 \n", | |
| "79 0.000000 0.000000 0.0000 0.000000 \n", | |
| "80 0.000000 0.000000 0.0000 0.000000 \n", | |
| "81 0.000000 0.000000 0.0000 0.000000 \n", | |
| "82 0.000000 0.000000 0.0000 0.000000 \n", | |
| "83 0.000000 0.000000 0.0000 0.000000 \n", | |
| "84 0.000000 0.000000 0.0000 0.000000 \n", | |
| "85 0.000000 0.000000 0.0000 0.000000 \n", | |
| "86 0.000000 0.000000 0.0000 0.000000 \n", | |
| "87 0.000000 0.000000 0.0000 0.000000 \n", | |
| "88 0.000000 0.000000 0.0000 0.000000 \n", | |
| "89 0.000000 0.000000 0.0625 0.000000 \n", | |
| "90 0.000000 0.000000 0.0000 0.000000 \n", | |
| "91 0.000000 0.000000 0.0000 0.000000 \n", | |
| "92 0.000000 0.000000 0.0000 0.000000 \n", | |
| "93 0.000000 0.027778 0.0000 0.000000 \n", | |
| "94 0.000000 0.000000 0.0000 0.000000 \n", | |
| "95 0.000000 0.000000 0.0000 0.000000 \n", | |
| "96 0.000000 0.000000 0.0000 0.000000 \n", | |
| "97 0.111111 0.000000 0.0000 0.000000 \n", | |
| "98 0.000000 0.000000 0.0000 0.000000 \n", | |
| "\n", | |
| " Wings Joint Women's Store Yoga Studio \n", | |
| "0 0.000000 0.000000 0.000000 \n", | |
| "1 0.000000 0.000000 0.000000 \n", | |
| "2 0.000000 0.000000 0.000000 \n", | |
| "3 0.000000 0.000000 0.000000 \n", | |
| "4 0.000000 0.000000 0.000000 \n", | |
| "5 0.000000 0.000000 0.000000 \n", | |
| "6 0.000000 0.000000 0.000000 \n", | |
| "7 0.000000 0.000000 0.000000 \n", | |
| "8 0.000000 0.000000 0.000000 \n", | |
| "9 0.000000 0.000000 0.000000 \n", | |
| "10 0.000000 0.000000 0.000000 \n", | |
| "11 0.000000 0.000000 0.000000 \n", | |
| "12 0.000000 0.000000 0.000000 \n", | |
| "13 0.000000 0.000000 0.000000 \n", | |
| "14 0.000000 0.000000 0.000000 \n", | |
| "15 0.000000 0.000000 0.000000 \n", | |
| "16 0.000000 0.166667 0.000000 \n", | |
| "17 0.000000 0.000000 0.000000 \n", | |
| "18 0.000000 0.000000 0.000000 \n", | |
| "19 0.000000 0.000000 0.011494 \n", | |
| "20 0.000000 0.000000 0.000000 \n", | |
| "21 0.000000 0.000000 0.000000 \n", | |
| "22 0.011628 0.000000 0.011628 \n", | |
| "23 0.000000 0.000000 0.000000 \n", | |
| "24 0.000000 0.000000 0.000000 \n", | |
| "25 0.000000 0.000000 0.000000 \n", | |
| "26 0.000000 0.000000 0.000000 \n", | |
| "27 0.000000 0.000000 0.000000 \n", | |
| "28 0.000000 0.000000 0.000000 \n", | |
| "29 0.000000 0.000000 0.000000 \n", | |
| ".. ... ... ... \n", | |
| "69 0.000000 0.000000 0.000000 \n", | |
| "70 0.000000 0.000000 0.000000 \n", | |
| "71 0.000000 0.000000 0.000000 \n", | |
| "72 0.000000 0.000000 0.000000 \n", | |
| "73 0.025641 0.000000 0.025641 \n", | |
| "74 0.000000 0.000000 0.000000 \n", | |
| "75 0.000000 0.000000 0.000000 \n", | |
| "76 0.000000 0.000000 0.000000 \n", | |
| "77 0.000000 0.000000 0.000000 \n", | |
| "78 0.000000 0.000000 0.000000 \n", | |
| "79 0.000000 0.000000 0.000000 \n", | |
| "80 0.000000 0.010000 0.000000 \n", | |
| "81 0.000000 0.000000 0.000000 \n", | |
| "82 0.000000 0.000000 0.027027 \n", | |
| "83 0.000000 0.000000 0.000000 \n", | |
| "84 0.000000 0.000000 0.000000 \n", | |
| "85 0.000000 0.000000 0.000000 \n", | |
| "86 0.000000 0.000000 0.023810 \n", | |
| "87 0.000000 0.000000 0.000000 \n", | |
| "88 0.000000 0.000000 0.000000 \n", | |
| "89 0.000000 0.000000 0.062500 \n", | |
| "90 0.000000 0.000000 0.000000 \n", | |
| "91 0.000000 0.000000 0.000000 \n", | |
| "92 0.000000 0.000000 0.000000 \n", | |
| "93 0.000000 0.000000 0.000000 \n", | |
| "94 0.000000 0.000000 0.000000 \n", | |
| "95 0.000000 0.000000 0.000000 \n", | |
| "96 0.000000 0.000000 0.000000 \n", | |
| "97 0.000000 0.000000 0.000000 \n", | |
| "98 0.000000 0.000000 0.000000 \n", | |
| "\n", | |
| "[99 rows x 279 columns]" | |
| ] | |
| }, | |
| "execution_count": 46, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "toronto_grouped = toronto_onehot.groupby('Neighbourhood').mean().reset_index()\n", | |
| "toronto_grouped" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 47, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "----Adelaide, King, Richmond----\n", | |
| " venue freq\n", | |
| "0 Coffee Shop 0.06\n", | |
| "1 Café 0.05\n", | |
| "2 Bar 0.04\n", | |
| "3 American Restaurant 0.04\n", | |
| "4 Thai Restaurant 0.04\n", | |
| "\n", | |
| "\n", | |
| "----Agincourt----\n", | |
| " venue freq\n", | |
| "0 Skating Rink 0.25\n", | |
| "1 Clothing Store 0.25\n", | |
| "2 Breakfast Spot 0.25\n", | |
| "3 Lounge 0.25\n", | |
| "4 Motel 0.00\n", | |
| "\n", | |
| "\n", | |
| "----Agincourt North, L'Amoreaux East, Milliken, Steeles East----\n", | |
| " venue freq\n", | |
| "0 Playground 0.5\n", | |
| "1 Park 0.5\n", | |
| "2 Accessories Store 0.0\n", | |
| "3 Middle Eastern Restaurant 0.0\n", | |
| "4 Motel 0.0\n", | |
| "\n", | |
| "\n", | |
| "----Albion Gardens, Beaumond Heights, Humbergate, Jamestown, Mount Olive, Silverstone, South Steeles, Thistletown----\n", | |
| " venue freq\n", | |
| "0 Grocery Store 0.2\n", | |
| "1 Pizza Place 0.1\n", | |
| "2 Fried Chicken Joint 0.1\n", | |
| "3 Sandwich Place 0.1\n", | |
| "4 Pharmacy 0.1\n", | |
| "\n", | |
| "\n", | |
| "----Alderwood, Long Branch----\n", | |
| " venue freq\n", | |
| "0 Pizza Place 0.2\n", | |
| "1 Pharmacy 0.1\n", | |
| "2 Gym 0.1\n", | |
| "3 Sandwich Place 0.1\n", | |
| "4 Athletics & Sports 0.1\n", | |
| "\n", | |
| "\n", | |
| "----Bathurst Manor, Downsview North, Wilson Heights----\n", | |
| " venue freq\n", | |
| "0 Coffee Shop 0.11\n", | |
| "1 Fried Chicken Joint 0.06\n", | |
| "2 Shopping Mall 0.06\n", | |
| "3 Bank 0.06\n", | |
| "4 Sushi Restaurant 0.06\n", | |
| "\n", | |
| "\n", | |
| "----Bayview Village----\n", | |
| " venue freq\n", | |
| "0 Japanese Restaurant 0.25\n", | |
| "1 Café 0.25\n", | |
| "2 Chinese Restaurant 0.25\n", | |
| "3 Bank 0.25\n", | |
| "4 Accessories Store 0.00\n", | |
| "\n", | |
| "\n", | |
| "----Bedford Park, Lawrence Manor East----\n", | |
| " venue freq\n", | |
| "0 Fast Food Restaurant 0.08\n", | |
| "1 Coffee Shop 0.08\n", | |
| "2 Italian Restaurant 0.08\n", | |
| "3 Pharmacy 0.04\n", | |
| "4 Grocery Store 0.04\n", | |
| "\n", | |
| "\n", | |
| "----Berczy Park----\n", | |
| " venue freq\n", | |
| "0 Coffee Shop 0.07\n", | |
| "1 Cocktail Bar 0.05\n", | |
| "2 Cheese Shop 0.04\n", | |
| "3 Farmers Market 0.04\n", | |
| "4 Bakery 0.04\n", | |
| "\n", | |
| "\n", | |
| "----Birch Cliff, Cliffside West----\n", | |
| " venue freq\n", | |
| "0 College Stadium 0.25\n", | |
| "1 General Entertainment 0.25\n", | |
| "2 Café 0.25\n", | |
| "3 Skating Rink 0.25\n", | |
| "4 Accessories Store 0.00\n", | |
| "\n", | |
| "\n", | |
| "----Bloordale Gardens, Eringate, Markland Wood, Old Burnhamthorpe----\n", | |
| " venue freq\n", | |
| "0 Pharmacy 0.12\n", | |
| "1 Park 0.12\n", | |
| "2 Shopping Plaza 0.12\n", | |
| "3 Liquor Store 0.12\n", | |
| "4 Beer Store 0.12\n", | |
| "\n", | |
| "\n", | |
| "----Brockton, Exhibition Place, Parkdale Village----\n", | |
| " venue freq\n", | |
| "0 Café 0.10\n", | |
| "1 Breakfast Spot 0.10\n", | |
| "2 Coffee Shop 0.10\n", | |
| "3 Climbing Gym 0.05\n", | |
| "4 Bar 0.05\n", | |
| "\n", | |
| "\n", | |
| "----Business Reply Mail Processing Centre 969 Eastern----\n", | |
| " venue freq\n", | |
| "0 Light Rail Station 0.12\n", | |
| "1 Farmers Market 0.06\n", | |
| "2 Skate Park 0.06\n", | |
| "3 Brewery 0.06\n", | |
| "4 Restaurant 0.06\n", | |
| "\n", | |
| "\n", | |
| "----CFB Toronto, Downsview East----\n", | |
| " venue freq\n", | |
| "0 Airport 0.33\n", | |
| "1 Bus Stop 0.33\n", | |
| "2 Park 0.33\n", | |
| "3 Accessories Store 0.00\n", | |
| "4 Mobile Phone Shop 0.00\n", | |
| "\n", | |
| "\n", | |
| "----CN Tower, Bathurst Quay, Island airport, Harbourfront West, King and Spadina, Railway Lands, South Niagara----\n", | |
| " venue freq\n", | |
| "0 Airport Service 0.20\n", | |
| "1 Airport Terminal 0.13\n", | |
| "2 Airport Lounge 0.13\n", | |
| "3 Boutique 0.07\n", | |
| "4 Sculpture Garden 0.07\n", | |
| "\n", | |
| "\n", | |
| "----Cabbagetown, St. James Town----\n", | |
| " venue freq\n", | |
| "0 Coffee Shop 0.09\n", | |
| "1 Park 0.07\n", | |
| "2 Café 0.04\n", | |
| "3 Pub 0.04\n", | |
| "4 Pizza Place 0.04\n", | |
| "\n", | |
| "\n", | |
| "----Caledonia-Fairbanks----\n", | |
| " venue freq\n", | |
| "0 Park 0.33\n", | |
| "1 Market 0.17\n", | |
| "2 Fast Food Restaurant 0.17\n", | |
| "3 Pharmacy 0.17\n", | |
| "4 Women's Store 0.17\n", | |
| "\n", | |
| "\n", | |
| "----Canada Post Gateway Processing Centre----\n", | |
| " venue freq\n", | |
| "0 Coffee Shop 0.2\n", | |
| "1 Hotel 0.2\n", | |
| "2 Mediterranean Restaurant 0.1\n", | |
| "3 Gym / Fitness Center 0.1\n", | |
| "4 Fried Chicken Joint 0.1\n", | |
| "\n", | |
| "\n", | |
| "----Cedarbrae----\n", | |
| " venue freq\n", | |
| "0 Bakery 0.14\n", | |
| "1 Bank 0.14\n", | |
| "2 Thai Restaurant 0.14\n", | |
| "3 Athletics & Sports 0.14\n", | |
| "4 Caribbean Restaurant 0.14\n", | |
| "\n", | |
| "\n", | |
| "----Central Bay Street----\n", | |
| " venue freq\n", | |
| "0 Coffee Shop 0.16\n", | |
| "1 Café 0.06\n", | |
| "2 Italian Restaurant 0.05\n", | |
| "3 Burger Joint 0.03\n", | |
| "4 Sandwich Place 0.03\n", | |
| "\n", | |
| "\n", | |
| "----Chinatown, Grange Park, Kensington Market----\n", | |
| " venue freq\n", | |
| "0 Café 0.08\n", | |
| "1 Vegetarian / Vegan Restaurant 0.06\n", | |
| "2 Bakery 0.04\n", | |
| "3 Mexican Restaurant 0.04\n", | |
| "4 Coffee Shop 0.04\n", | |
| "\n", | |
| "\n", | |
| "----Christie----\n", | |
| " venue freq\n", | |
| "0 Café 0.19\n", | |
| "1 Grocery Store 0.19\n", | |
| "2 Park 0.12\n", | |
| "3 Convenience Store 0.06\n", | |
| "4 Coffee Shop 0.06\n", | |
| "\n", | |
| "\n", | |
| "----Church and Wellesley----\n", | |
| " venue freq\n", | |
| "0 Coffee Shop 0.07\n", | |
| "1 Japanese Restaurant 0.07\n", | |
| "2 Sushi Restaurant 0.06\n", | |
| "3 Restaurant 0.03\n", | |
| "4 Gay Bar 0.03\n", | |
| "\n", | |
| "\n", | |
| "----Clairlea, Golden Mile, Oakridge----\n", | |
| " venue freq\n", | |
| "0 Bakery 0.2\n", | |
| "1 Bus Line 0.2\n", | |
| "2 Intersection 0.1\n", | |
| "3 Soccer Field 0.1\n", | |
| "4 Metro Station 0.1\n", | |
| "\n", | |
| "\n", | |
| "----Clarks Corners, Sullivan, Tam O'Shanter----\n", | |
| " venue freq\n", | |
| "0 Pizza Place 0.2\n", | |
| "1 Pharmacy 0.1\n", | |
| "2 Bank 0.1\n", | |
| "3 Fast Food Restaurant 0.1\n", | |
| "4 Thai Restaurant 0.1\n", | |
| "\n", | |
| "\n", | |
| "----Cliffcrest, Cliffside, Scarborough Village West----\n", | |
| " venue freq\n", | |
| "0 American Restaurant 0.5\n", | |
| "1 Motel 0.5\n", | |
| "2 Music Venue 0.0\n", | |
| "3 Museum 0.0\n", | |
| "4 Movie Theater 0.0\n", | |
| "\n", | |
| "\n", | |
| "----Cloverdale, Islington, Martin Grove, Princess Gardens, West Deane Park----\n", | |
| " venue freq\n", | |
| "0 Bank 1.0\n", | |
| "1 Accessories Store 0.0\n", | |
| "2 Mobile Phone Shop 0.0\n", | |
| "3 Movie Theater 0.0\n", | |
| "4 Motel 0.0\n", | |
| "\n", | |
| "\n", | |
| "----Commerce Court, Victoria Hotel----\n", | |
| " venue freq\n", | |
| "0 Coffee Shop 0.11\n", | |
| "1 Café 0.07\n", | |
| "2 Hotel 0.06\n", | |
| "3 Restaurant 0.05\n", | |
| "4 American Restaurant 0.04\n", | |
| "\n", | |
| "\n", | |
| "----Davisville----\n", | |
| " venue freq\n", | |
| "0 Pizza Place 0.14\n", | |
| "1 Dessert Shop 0.08\n", | |
| "2 Sandwich Place 0.08\n", | |
| "3 Coffee Shop 0.06\n", | |
| "4 Restaurant 0.06\n", | |
| "\n", | |
| "\n", | |
| "----Davisville North----\n", | |
| " venue freq\n", | |
| "0 Sandwich Place 0.17\n", | |
| "1 Breakfast Spot 0.17\n", | |
| "2 Hotel 0.17\n", | |
| "3 Park 0.17\n", | |
| "4 Gym 0.17\n", | |
| "\n", | |
| "\n", | |
| "----Deer Park, Forest Hill SE, Rathnelly, South Hill, Summerhill West----\n", | |
| " venue freq\n", | |
| "0 Pub 0.14\n", | |
| "1 Coffee Shop 0.14\n", | |
| "2 Bagel Shop 0.07\n", | |
| "3 Fried Chicken Joint 0.07\n", | |
| "4 Pizza Place 0.07\n", | |
| "\n", | |
| "\n", | |
| "----Del Ray, Keelesdale, Mount Dennis, Silverthorn----\n", | |
| " venue freq\n", | |
| "0 Check Cashing Service 0.2\n", | |
| "1 Turkish Restaurant 0.2\n", | |
| "2 Sandwich Place 0.2\n", | |
| "3 Convenience Store 0.2\n", | |
| "4 Restaurant 0.2\n", | |
| "\n", | |
| "\n", | |
| "----Design Exchange, Toronto Dominion Centre----\n", | |
| " venue freq\n", | |
| "0 Coffee Shop 0.12\n", | |
| "1 Hotel 0.07\n", | |
| "2 Café 0.07\n", | |
| "3 Restaurant 0.05\n", | |
| "4 Deli / Bodega 0.03\n", | |
| "\n", | |
| "\n", | |
| "----Don Mills North----\n", | |
| " venue freq\n", | |
| "0 Japanese Restaurant 0.17\n", | |
| "1 Café 0.17\n", | |
| "2 Baseball Field 0.17\n", | |
| "3 Gym / Fitness Center 0.17\n", | |
| "4 Basketball Court 0.17\n", | |
| "\n", | |
| "\n", | |
| "----Dorset Park, Scarborough Town Centre, Wexford Heights----\n", | |
| " venue freq\n", | |
| "0 Indian Restaurant 0.25\n", | |
| "1 Pet Store 0.12\n", | |
| "2 Chinese Restaurant 0.12\n", | |
| "3 Furniture / Home Store 0.12\n", | |
| "4 Vietnamese Restaurant 0.12\n", | |
| "\n", | |
| "\n", | |
| "----Dovercourt Village, Dufferin----\n", | |
| " venue freq\n", | |
| "0 Pharmacy 0.11\n", | |
| "1 Bakery 0.11\n", | |
| "2 Supermarket 0.11\n", | |
| "3 Pool 0.05\n", | |
| "4 Fast Food Restaurant 0.05\n", | |
| "\n", | |
| "\n", | |
| "----Downsview Central----\n", | |
| " venue freq\n", | |
| "0 Home Service 0.33\n", | |
| "1 Food Truck 0.33\n", | |
| "2 Baseball Field 0.33\n", | |
| "3 Accessories Store 0.00\n", | |
| "4 Miscellaneous Shop 0.00\n", | |
| "\n", | |
| "\n", | |
| "----Downsview Northwest----\n", | |
| " venue freq\n", | |
| "0 Grocery Store 0.2\n", | |
| "1 Athletics & Sports 0.2\n", | |
| "2 Liquor Store 0.2\n", | |
| "3 Gym / Fitness Center 0.2\n", | |
| "4 Discount Store 0.2\n", | |
| "\n", | |
| "\n", | |
| "----Downsview West----\n", | |
| " venue freq\n", | |
| "0 Grocery Store 0.25\n", | |
| "1 Bank 0.25\n", | |
| "2 Park 0.25\n", | |
| "3 Shopping Mall 0.25\n", | |
| "4 Miscellaneous Shop 0.00\n", | |
| "\n", | |
| "\n", | |
| "----Downsview, North Park, Upwood Park----\n", | |
| " venue freq\n", | |
| "0 Basketball Court 0.25\n", | |
| "1 Construction & Landscaping 0.25\n", | |
| "2 Bakery 0.25\n", | |
| "3 Park 0.25\n", | |
| "4 Accessories Store 0.00\n", | |
| "\n", | |
| "\n", | |
| "----East Birchmount Park, Ionview, Kennedy Park----\n", | |
| " venue freq\n", | |
| "0 Discount Store 0.25\n", | |
| "1 Convenience Store 0.25\n", | |
| "2 Department Store 0.25\n", | |
| "3 Coffee Shop 0.25\n", | |
| "4 Molecular Gastronomy Restaurant 0.00\n", | |
| "\n", | |
| "\n", | |
| "----East Toronto----\n", | |
| " venue freq\n", | |
| "0 Convenience Store 0.33\n", | |
| "1 Park 0.33\n", | |
| "2 Coffee Shop 0.33\n", | |
| "3 Accessories Store 0.00\n", | |
| "4 Miscellaneous Shop 0.00\n", | |
| "\n", | |
| "\n", | |
| "----Emery, Humberlea----\n", | |
| " venue freq\n", | |
| "0 Construction & Landscaping 0.5\n", | |
| "1 Baseball Field 0.5\n", | |
| "2 Accessories Store 0.0\n", | |
| "3 Mobile Phone Shop 0.0\n", | |
| "4 Movie Theater 0.0\n", | |
| "\n", | |
| "\n", | |
| "----Fairview, Henry Farm, Oriole----\n", | |
| " venue freq\n", | |
| "0 Clothing Store 0.14\n", | |
| "1 Fast Food Restaurant 0.08\n", | |
| "2 Coffee Shop 0.08\n", | |
| "3 Japanese Restaurant 0.03\n", | |
| "4 Asian Restaurant 0.03\n", | |
| "\n", | |
| "\n", | |
| "----First Canadian Place, Underground city----\n", | |
| " venue freq\n", | |
| "0 Café 0.09\n", | |
| "1 Coffee Shop 0.09\n", | |
| "2 Hotel 0.04\n", | |
| "3 Seafood Restaurant 0.03\n", | |
| "4 Gastropub 0.03\n", | |
| "\n", | |
| "\n", | |
| "----Flemingdon Park, Don Mills South----\n", | |
| " venue freq\n", | |
| "0 Gym 0.10\n", | |
| "1 Coffee Shop 0.10\n", | |
| "2 Beer Store 0.10\n", | |
| "3 Asian Restaurant 0.10\n", | |
| "4 Italian Restaurant 0.05\n", | |
| "\n", | |
| "\n", | |
| "----Forest Hill North, Forest Hill West----\n", | |
| " venue freq\n", | |
| "0 Jewelry Store 0.25\n", | |
| "1 Park 0.25\n", | |
| "2 Trail 0.25\n", | |
| "3 Sushi Restaurant 0.25\n", | |
| "4 Accessories Store 0.00\n", | |
| "\n", | |
| "\n", | |
| "----Glencairn----\n", | |
| " venue freq\n", | |
| "0 Japanese Restaurant 0.25\n", | |
| "1 Park 0.25\n", | |
| "2 Pub 0.25\n", | |
| "3 Pizza Place 0.25\n", | |
| "4 Performing Arts Venue 0.00\n", | |
| "\n", | |
| "\n", | |
| "----Guildwood, Morningside, West Hill----\n", | |
| " venue freq\n", | |
| "0 Spa 0.12\n", | |
| "1 Intersection 0.12\n", | |
| "2 Rental Car Location 0.12\n", | |
| "3 Electronics Store 0.12\n", | |
| "4 Mexican Restaurant 0.12\n", | |
| "\n", | |
| "\n", | |
| "----Harbord, University of Toronto----\n", | |
| " venue freq\n", | |
| "0 Café 0.11\n", | |
| "1 Bakery 0.06\n", | |
| "2 Italian Restaurant 0.06\n", | |
| "3 Japanese Restaurant 0.06\n", | |
| "4 Bookstore 0.06\n", | |
| "\n", | |
| "\n", | |
| "----Harbourfront East, Toronto Islands, Union Station----\n", | |
| " venue freq\n", | |
| "0 Coffee Shop 0.12\n", | |
| "1 Hotel 0.05\n", | |
| "2 Aquarium 0.05\n", | |
| "3 Italian Restaurant 0.04\n", | |
| "4 Café 0.04\n", | |
| "\n", | |
| "\n", | |
| "----Harbourfront, Regent Park----\n", | |
| " venue freq\n", | |
| "0 Coffee Shop 0.15\n", | |
| "1 Park 0.07\n", | |
| "2 Pub 0.07\n", | |
| "3 Bakery 0.07\n", | |
| "4 Breakfast Spot 0.04\n", | |
| "\n", | |
| "\n", | |
| "----High Park, The Junction South----\n", | |
| " venue freq\n", | |
| "0 Mexican Restaurant 0.09\n", | |
| "1 Café 0.09\n", | |
| "2 Bar 0.09\n", | |
| "3 Fried Chicken Joint 0.04\n", | |
| "4 Grocery Store 0.04\n", | |
| "\n", | |
| "\n", | |
| "----Highland Creek, Rouge Hill, Port Union----\n", | |
| " venue freq\n", | |
| "0 History Museum 0.5\n", | |
| "1 Bar 0.5\n", | |
| "2 Mobile Phone Shop 0.0\n", | |
| "3 Movie Theater 0.0\n", | |
| "4 Motel 0.0\n", | |
| "\n", | |
| "\n", | |
| "----Hillcrest Village----\n", | |
| " venue freq\n", | |
| "0 Dog Run 0.25\n", | |
| "1 Mediterranean Restaurant 0.25\n", | |
| "2 Pool 0.25\n", | |
| "3 Golf Course 0.25\n", | |
| "4 Mobile Phone Shop 0.00\n", | |
| "\n", | |
| "\n", | |
| "----Humber Bay Shores, Mimico South, New Toronto----\n", | |
| " venue freq\n", | |
| "0 Café 0.13\n", | |
| "1 Pharmacy 0.07\n", | |
| "2 American Restaurant 0.07\n", | |
| "3 Sandwich Place 0.07\n", | |
| "4 Restaurant 0.07\n", | |
| "\n", | |
| "\n", | |
| "----Humber Bay, King's Mill Park, Kingsway Park South East, Mimico NE, Old Mill South, The Queensway East, Royal York South East, Sunnylea----\n", | |
| " venue freq\n", | |
| "0 Locksmith 0.5\n", | |
| "1 Baseball Field 0.5\n", | |
| "2 Accessories Store 0.0\n", | |
| "3 Mobile Phone Shop 0.0\n", | |
| "4 Movie Theater 0.0\n", | |
| "\n", | |
| "\n", | |
| "----Humber Summit----\n", | |
| " venue freq\n", | |
| "0 Pizza Place 0.33\n", | |
| "1 Gym 0.33\n", | |
| "2 Empanada Restaurant 0.33\n", | |
| "3 Mediterranean Restaurant 0.00\n", | |
| "4 Men's Store 0.00\n", | |
| "\n", | |
| "\n", | |
| "----Humewood-Cedarvale----\n", | |
| " venue freq\n", | |
| "0 Hockey Arena 0.25\n", | |
| "1 Field 0.25\n", | |
| "2 Trail 0.25\n", | |
| "3 Dog Run 0.25\n", | |
| "4 Mediterranean Restaurant 0.00\n", | |
| "\n", | |
| "\n", | |
| "----Kingsview Village, Martin Grove Gardens, Richview Gardens, St. Phillips----\n", | |
| " venue freq\n", | |
| "0 Pizza Place 0.33\n", | |
| "1 Park 0.33\n", | |
| "2 Mobile Phone Shop 0.33\n", | |
| "3 Middle Eastern Restaurant 0.00\n", | |
| "4 Motel 0.00\n", | |
| "\n", | |
| "\n", | |
| "----Kingsway Park South West, Mimico NW, The Queensway West, Royal York South West, South of Bloor----\n", | |
| " venue freq\n", | |
| "0 Flower Shop 0.08\n", | |
| "1 Fast Food Restaurant 0.08\n", | |
| "2 Sandwich Place 0.08\n", | |
| "3 Supplement Shop 0.08\n", | |
| "4 Discount Store 0.08\n", | |
| "\n", | |
| "\n", | |
| "----L'Amoreaux West----\n", | |
| " venue freq\n", | |
| "0 Fast Food Restaurant 0.15\n", | |
| "1 Chinese Restaurant 0.15\n", | |
| "2 Pharmacy 0.08\n", | |
| "3 Gym 0.08\n", | |
| "4 Pizza Place 0.08\n", | |
| "\n", | |
| "\n", | |
| "----Lawrence Heights, Lawrence Manor----\n", | |
| " venue freq\n", | |
| "0 Clothing Store 0.25\n", | |
| "1 Furniture / Home Store 0.19\n", | |
| "2 Women's Store 0.12\n", | |
| "3 Accessories Store 0.06\n", | |
| "4 Coffee Shop 0.06\n", | |
| "\n", | |
| "\n", | |
| "----Lawrence Park----\n", | |
| " venue freq\n", | |
| "0 Park 0.33\n", | |
| "1 Bus Line 0.33\n", | |
| "2 Swim School 0.33\n", | |
| "3 Accessories Store 0.00\n", | |
| "4 Mobile Phone Shop 0.00\n", | |
| "\n", | |
| "\n", | |
| "----Leaside----\n", | |
| " venue freq\n", | |
| "0 Coffee Shop 0.09\n", | |
| "1 Sporting Goods Shop 0.09\n", | |
| "2 Burger Joint 0.06\n", | |
| "3 Furniture / Home Store 0.06\n", | |
| "4 Grocery Store 0.06\n", | |
| "\n", | |
| "\n", | |
| "----Little Portugal, Trinity----\n", | |
| " venue freq\n", | |
| "0 Bar 0.13\n", | |
| "1 Men's Store 0.05\n", | |
| "2 Coffee Shop 0.05\n", | |
| "3 Asian Restaurant 0.05\n", | |
| "4 New American Restaurant 0.03\n", | |
| "\n", | |
| "\n", | |
| "----Maryvale, Wexford----\n", | |
| " venue freq\n", | |
| "0 Auto Garage 0.17\n", | |
| "1 Smoke Shop 0.17\n", | |
| "2 Bakery 0.17\n", | |
| "3 Shopping Mall 0.17\n", | |
| "4 Sandwich Place 0.17\n", | |
| "\n", | |
| "\n", | |
| "----Moore Park, Summerhill East----\n", | |
| " venue freq\n", | |
| "0 Tennis Court 0.25\n", | |
| "1 Playground 0.25\n", | |
| "2 Park 0.25\n", | |
| "3 Trail 0.25\n", | |
| "4 Miscellaneous Shop 0.00\n", | |
| "\n", | |
| "\n", | |
| "----North Toronto West----\n", | |
| " venue freq\n", | |
| "0 Clothing Store 0.20\n", | |
| "1 Coffee Shop 0.10\n", | |
| "2 Yoga Studio 0.05\n", | |
| "3 Gym / Fitness Center 0.05\n", | |
| "4 Chinese Restaurant 0.05\n", | |
| "\n", | |
| "\n", | |
| "----Northwest----\n", | |
| " venue freq\n", | |
| "0 Drugstore 0.33\n", | |
| "1 Bar 0.33\n", | |
| "2 Rental Car Location 0.33\n", | |
| "3 Accessories Store 0.00\n", | |
| "4 Museum 0.00\n", | |
| "\n", | |
| "\n", | |
| "----Northwood Park, York University----\n", | |
| " venue freq\n", | |
| "0 Massage Studio 0.14\n", | |
| "1 Coffee Shop 0.14\n", | |
| "2 Metro Station 0.14\n", | |
| "3 Falafel Restaurant 0.14\n", | |
| "4 Miscellaneous Shop 0.14\n", | |
| "\n", | |
| "\n", | |
| "----Parkdale, Roncesvalles----\n", | |
| " venue freq\n", | |
| "0 Breakfast Spot 0.13\n", | |
| "1 Gift Shop 0.13\n", | |
| "2 Bookstore 0.07\n", | |
| "3 Dessert Shop 0.07\n", | |
| "4 Eastern European Restaurant 0.07\n", | |
| "\n", | |
| "\n", | |
| "----Parkwoods----\n", | |
| " venue freq\n", | |
| "0 Fast Food Restaurant 0.33\n", | |
| "1 Food & Drink Shop 0.33\n", | |
| "2 Park 0.33\n", | |
| "3 Accessories Store 0.00\n", | |
| "4 Miscellaneous Shop 0.00\n", | |
| "\n", | |
| "\n", | |
| "----Queen's Park----\n", | |
| " venue freq\n", | |
| "0 Coffee Shop 0.23\n", | |
| "1 Sushi Restaurant 0.05\n", | |
| "2 Japanese Restaurant 0.05\n", | |
| "3 Gym 0.05\n", | |
| "4 Park 0.05\n", | |
| "\n", | |
| "\n", | |
| "----Rosedale----\n", | |
| " venue freq\n", | |
| "0 Park 0.50\n", | |
| "1 Playground 0.25\n", | |
| "2 Trail 0.25\n", | |
| "3 Accessories Store 0.00\n", | |
| "4 Miscellaneous Shop 0.00\n", | |
| "\n", | |
| "\n", | |
| "----Roselawn----\n", | |
| " venue freq\n", | |
| "0 Ice Cream Shop 0.5\n", | |
| "1 Garden 0.5\n", | |
| "2 Music Store 0.0\n", | |
| "3 Movie Theater 0.0\n", | |
| "4 Motel 0.0\n", | |
| "\n", | |
| "\n", | |
| "----Rouge, Malvern----\n", | |
| " venue freq\n", | |
| "0 Fast Food Restaurant 1.0\n", | |
| "1 Accessories Store 0.0\n", | |
| "2 Miscellaneous Shop 0.0\n", | |
| "3 Movie Theater 0.0\n", | |
| "4 Motel 0.0\n", | |
| "\n", | |
| "\n", | |
| "----Runnymede, Swansea----\n", | |
| " venue freq\n", | |
| "0 Pizza Place 0.10\n", | |
| "1 Café 0.08\n", | |
| "2 Coffee Shop 0.08\n", | |
| "3 Italian Restaurant 0.05\n", | |
| "4 Sushi Restaurant 0.05\n", | |
| "\n", | |
| "\n", | |
| "----Ryerson, Garden District----\n", | |
| " venue freq\n", | |
| "0 Coffee Shop 0.10\n", | |
| "1 Clothing Store 0.06\n", | |
| "2 Cosmetics Shop 0.04\n", | |
| "3 Café 0.04\n", | |
| "4 Middle Eastern Restaurant 0.03\n", | |
| "\n", | |
| "\n", | |
| "----Scarborough Village----\n", | |
| " venue freq\n", | |
| "0 Playground 1.0\n", | |
| "1 Accessories Store 0.0\n", | |
| "2 Miscellaneous Shop 0.0\n", | |
| "3 Movie Theater 0.0\n", | |
| "4 Motel 0.0\n", | |
| "\n", | |
| "\n", | |
| "----St. James Town----\n", | |
| " venue freq\n", | |
| "0 Coffee Shop 0.07\n", | |
| "1 Café 0.06\n", | |
| "2 Hotel 0.05\n", | |
| "3 Restaurant 0.05\n", | |
| "4 Cosmetics Shop 0.04\n", | |
| "\n", | |
| "\n", | |
| "----Stn A PO Boxes 25 The Esplanade----\n", | |
| " venue freq\n", | |
| "0 Coffee Shop 0.11\n", | |
| "1 Restaurant 0.04\n", | |
| "2 Café 0.04\n", | |
| "3 Italian Restaurant 0.03\n", | |
| "4 Hotel 0.03\n", | |
| "\n", | |
| "\n", | |
| "----Studio District----\n", | |
| " venue freq\n", | |
| "0 Café 0.11\n", | |
| "1 Coffee Shop 0.08\n", | |
| "2 Italian Restaurant 0.05\n", | |
| "3 Bakery 0.05\n", | |
| "4 Gastropub 0.05\n", | |
| "\n", | |
| "\n", | |
| "----The Annex, North Midtown, Yorkville----\n", | |
| " venue freq\n", | |
| "0 Coffee Shop 0.13\n", | |
| "1 Sandwich Place 0.13\n", | |
| "2 Café 0.13\n", | |
| "3 Pizza Place 0.09\n", | |
| "4 History Museum 0.04\n", | |
| "\n", | |
| "\n", | |
| "----The Beaches----\n", | |
| " venue freq\n", | |
| "0 Neighborhood 0.2\n", | |
| "1 Grocery Store 0.2\n", | |
| "2 Astrologer 0.2\n", | |
| "3 Pub 0.2\n", | |
| "4 Health Food Store 0.2\n", | |
| "\n", | |
| "\n", | |
| "----The Beaches West, India Bazaar----\n", | |
| " venue freq\n", | |
| "0 Sandwich Place 0.10\n", | |
| "1 Park 0.10\n", | |
| "2 Gym 0.05\n", | |
| "3 Liquor Store 0.05\n", | |
| "4 Movie Theater 0.05\n", | |
| "\n", | |
| "\n", | |
| "----The Danforth West, Riverdale----\n", | |
| " venue freq\n", | |
| "0 Greek Restaurant 0.21\n", | |
| "1 Coffee Shop 0.10\n", | |
| "2 Italian Restaurant 0.07\n", | |
| "3 Ice Cream Shop 0.07\n", | |
| "4 Furniture / Home Store 0.05\n", | |
| "\n", | |
| "\n", | |
| "----The Junction North, Runnymede----\n", | |
| " venue freq\n", | |
| "0 Pizza Place 0.25\n", | |
| "1 Convenience Store 0.25\n", | |
| "2 Bus Line 0.25\n", | |
| "3 Grocery Store 0.25\n", | |
| "4 Mediterranean Restaurant 0.00\n", | |
| "\n", | |
| "\n", | |
| "----The Kingsway, Montgomery Road, Old Mill North----\n", | |
| " venue freq\n", | |
| "0 Park 0.25\n", | |
| "1 River 0.25\n", | |
| "2 Pool 0.25\n", | |
| "3 Smoke Shop 0.25\n", | |
| "4 Accessories Store 0.00\n", | |
| "\n", | |
| "\n", | |
| "----Thorncliffe Park----\n", | |
| " venue freq\n", | |
| "0 Indian Restaurant 0.12\n", | |
| "1 Yoga Studio 0.06\n", | |
| "2 Grocery Store 0.06\n", | |
| "3 Park 0.06\n", | |
| "4 Coffee Shop 0.06\n", | |
| "\n", | |
| "\n", | |
| "----Victoria Village----\n", | |
| " venue freq\n", | |
| "0 Hockey Arena 0.2\n", | |
| "1 Portuguese Restaurant 0.2\n", | |
| "2 Intersection 0.2\n", | |
| "3 Coffee Shop 0.2\n", | |
| "4 Pizza Place 0.2\n", | |
| "\n", | |
| "\n", | |
| "----Westmount----\n", | |
| " venue freq\n", | |
| "0 Pizza Place 0.17\n", | |
| "1 Middle Eastern Restaurant 0.17\n", | |
| "2 Chinese Restaurant 0.17\n", | |
| "3 Intersection 0.17\n", | |
| "4 Coffee Shop 0.17\n", | |
| "\n", | |
| "\n", | |
| "----Weston----\n", | |
| " venue freq\n", | |
| "0 Convenience Store 0.5\n", | |
| "1 Park 0.5\n", | |
| "2 Accessories Store 0.0\n", | |
| "3 Miscellaneous Shop 0.0\n", | |
| "4 Movie Theater 0.0\n", | |
| "\n", | |
| "\n", | |
| "----Willowdale South----\n", | |
| " venue freq\n", | |
| "0 Coffee Shop 0.08\n", | |
| "1 Restaurant 0.08\n", | |
| "2 Ramen Restaurant 0.08\n", | |
| "3 Japanese Restaurant 0.06\n", | |
| "4 Café 0.06\n", | |
| "\n", | |
| "\n", | |
| "----Willowdale West----\n", | |
| " venue freq\n", | |
| "0 Pharmacy 0.25\n", | |
| "1 Coffee Shop 0.25\n", | |
| "2 Pizza Place 0.25\n", | |
| "3 Discount Store 0.25\n", | |
| "4 Men's Store 0.00\n", | |
| "\n", | |
| "\n", | |
| "----Woburn----\n", | |
| " venue freq\n", | |
| "0 Coffee Shop 0.50\n", | |
| "1 Pharmacy 0.25\n", | |
| "2 Korean Restaurant 0.25\n", | |
| "3 Accessories Store 0.00\n", | |
| "4 Mobile Phone Shop 0.00\n", | |
| "\n", | |
| "\n", | |
| "----Woodbine Gardens, Parkview Hill----\n", | |
| " venue freq\n", | |
| "0 Pizza Place 0.15\n", | |
| "1 Fast Food Restaurant 0.15\n", | |
| "2 Pharmacy 0.08\n", | |
| "3 Gastropub 0.08\n", | |
| "4 Breakfast Spot 0.08\n", | |
| "\n", | |
| "\n", | |
| "----Woodbine Heights----\n", | |
| " venue freq\n", | |
| "0 Skating Rink 0.22\n", | |
| "1 Beer Store 0.11\n", | |
| "2 Pharmacy 0.11\n", | |
| "3 Cosmetics Shop 0.11\n", | |
| "4 Park 0.11\n", | |
| "\n", | |
| "\n", | |
| "----York Mills West----\n", | |
| " venue freq\n", | |
| "0 Convenience Store 0.33\n", | |
| "1 Bank 0.33\n", | |
| "2 Park 0.33\n", | |
| "3 Accessories Store 0.00\n", | |
| "4 Miscellaneous Shop 0.00\n", | |
| "\n", | |
| "\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "num_top_venues = 5\n", | |
| "\n", | |
| "for hood in toronto_grouped['Neighbourhood']:\n", | |
| " print(\"----\"+hood+\"----\")\n", | |
| " temp = toronto_grouped[toronto_grouped['Neighbourhood'] == hood].T.reset_index()\n", | |
| " temp.columns = ['venue','freq']\n", | |
| " temp = temp.iloc[1:]\n", | |
| " temp['freq'] = temp['freq'].astype(float)\n", | |
| " temp = temp.round({'freq': 2})\n", | |
| " print(temp.sort_values('freq', ascending=False).reset_index(drop=True).head(num_top_venues))\n", | |
| " print('\\n')" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 48, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "# put that into a pandas dataframe\n", | |
| "def return_most_common_venues(row, num_top_venues):\n", | |
| " row_categories = row.iloc[1:]\n", | |
| " row_categories_sorted = row_categories.sort_values(ascending=False)\n", | |
| " \n", | |
| " return row_categories_sorted.index.values[0:num_top_venues]" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 49, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<div>\n", | |
| "<style scoped>\n", | |
| " .dataframe tbody tr th:only-of-type {\n", | |
| " vertical-align: middle;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe tbody tr th {\n", | |
| " vertical-align: top;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe thead th {\n", | |
| " text-align: right;\n", | |
| " }\n", | |
| "</style>\n", | |
| "<table border=\"1\" class=\"dataframe\">\n", | |
| " <thead>\n", | |
| " <tr style=\"text-align: right;\">\n", | |
| " <th></th>\n", | |
| " <th>Neighbourhood</th>\n", | |
| " <th>1st Most Common Venue</th>\n", | |
| " <th>2nd Most Common Venue</th>\n", | |
| " <th>3rd Most Common Venue</th>\n", | |
| " <th>4th Most Common Venue</th>\n", | |
| " <th>5th Most Common Venue</th>\n", | |
| " <th>6th Most Common Venue</th>\n", | |
| " <th>7th Most Common Venue</th>\n", | |
| " <th>8th Most Common Venue</th>\n", | |
| " <th>9th Most Common Venue</th>\n", | |
| " <th>10th Most Common Venue</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>0</th>\n", | |
| " <td>Adelaide, King, Richmond</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " <td>Café</td>\n", | |
| " <td>Steakhouse</td>\n", | |
| " <td>Bar</td>\n", | |
| " <td>Thai Restaurant</td>\n", | |
| " <td>American Restaurant</td>\n", | |
| " <td>Bakery</td>\n", | |
| " <td>Cosmetics Shop</td>\n", | |
| " <td>Burger Joint</td>\n", | |
| " <td>Hotel</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>1</th>\n", | |
| " <td>Agincourt</td>\n", | |
| " <td>Lounge</td>\n", | |
| " <td>Breakfast Spot</td>\n", | |
| " <td>Skating Rink</td>\n", | |
| " <td>Clothing Store</td>\n", | |
| " <td>Yoga Studio</td>\n", | |
| " <td>Electronics Store</td>\n", | |
| " <td>Doner Restaurant</td>\n", | |
| " <td>Donut Shop</td>\n", | |
| " <td>Drugstore</td>\n", | |
| " <td>Dumpling Restaurant</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>2</th>\n", | |
| " <td>Agincourt North, L'Amoreaux East, Milliken, St...</td>\n", | |
| " <td>Playground</td>\n", | |
| " <td>Park</td>\n", | |
| " <td>Yoga Studio</td>\n", | |
| " <td>Eastern European Restaurant</td>\n", | |
| " <td>Discount Store</td>\n", | |
| " <td>Dog Run</td>\n", | |
| " <td>Doner Restaurant</td>\n", | |
| " <td>Donut Shop</td>\n", | |
| " <td>Drugstore</td>\n", | |
| " <td>Dumpling Restaurant</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>3</th>\n", | |
| " <td>Albion Gardens, Beaumond Heights, Humbergate, ...</td>\n", | |
| " <td>Grocery Store</td>\n", | |
| " <td>Pharmacy</td>\n", | |
| " <td>Video Store</td>\n", | |
| " <td>Sandwich Place</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " <td>Beer Store</td>\n", | |
| " <td>Fried Chicken Joint</td>\n", | |
| " <td>Pizza Place</td>\n", | |
| " <td>Fast Food Restaurant</td>\n", | |
| " <td>Empanada Restaurant</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>4</th>\n", | |
| " <td>Alderwood, Long Branch</td>\n", | |
| " <td>Pizza Place</td>\n", | |
| " <td>Gym</td>\n", | |
| " <td>Skating Rink</td>\n", | |
| " <td>Pharmacy</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " <td>Athletics & Sports</td>\n", | |
| " <td>Sandwich Place</td>\n", | |
| " <td>Pool</td>\n", | |
| " <td>Pub</td>\n", | |
| " <td>Yoga Studio</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " Neighbourhood 1st Most Common Venue \\\n", | |
| "0 Adelaide, King, Richmond Coffee Shop \n", | |
| "1 Agincourt Lounge \n", | |
| "2 Agincourt North, L'Amoreaux East, Milliken, St... Playground \n", | |
| "3 Albion Gardens, Beaumond Heights, Humbergate, ... Grocery Store \n", | |
| "4 Alderwood, Long Branch Pizza Place \n", | |
| "\n", | |
| " 2nd Most Common Venue 3rd Most Common Venue 4th Most Common Venue \\\n", | |
| "0 Café Steakhouse Bar \n", | |
| "1 Breakfast Spot Skating Rink Clothing Store \n", | |
| "2 Park Yoga Studio Eastern European Restaurant \n", | |
| "3 Pharmacy Video Store Sandwich Place \n", | |
| "4 Gym Skating Rink Pharmacy \n", | |
| "\n", | |
| " 5th Most Common Venue 6th Most Common Venue 7th Most Common Venue \\\n", | |
| "0 Thai Restaurant American Restaurant Bakery \n", | |
| "1 Yoga Studio Electronics Store Doner Restaurant \n", | |
| "2 Discount Store Dog Run Doner Restaurant \n", | |
| "3 Coffee Shop Beer Store Fried Chicken Joint \n", | |
| "4 Coffee Shop Athletics & Sports Sandwich Place \n", | |
| "\n", | |
| " 8th Most Common Venue 9th Most Common Venue 10th Most Common Venue \n", | |
| "0 Cosmetics Shop Burger Joint Hotel \n", | |
| "1 Donut Shop Drugstore Dumpling Restaurant \n", | |
| "2 Donut Shop Drugstore Dumpling Restaurant \n", | |
| "3 Pizza Place Fast Food Restaurant Empanada Restaurant \n", | |
| "4 Pool Pub Yoga Studio " | |
| ] | |
| }, | |
| "execution_count": 49, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "# create the new dataframe and display the top 10 venues for each neighborhood\n", | |
| "\n", | |
| "import numpy as np\n", | |
| "num_top_venues = 10\n", | |
| "\n", | |
| "indicators = ['st', 'nd', 'rd']\n", | |
| "\n", | |
| "# create columns according to number of top venues\n", | |
| "columns = ['Neighbourhood']\n", | |
| "for ind in np.arange(num_top_venues):\n", | |
| " try:\n", | |
| " columns.append('{}{} Most Common Venue'.format(ind+1, indicators[ind]))\n", | |
| " except:\n", | |
| " columns.append('{}th Most Common Venue'.format(ind+1))\n", | |
| "\n", | |
| "# create a new dataframe\n", | |
| "neighbourhoods_venues_sorted = pd.DataFrame(columns=columns)\n", | |
| "neighbourhoods_venues_sorted['Neighbourhood'] = toronto_grouped['Neighbourhood']\n", | |
| "\n", | |
| "for ind in np.arange(toronto_grouped.shape[0]):\n", | |
| " neighbourhoods_venues_sorted.iloc[ind, 1:] = return_most_common_venues(toronto_grouped.iloc[ind, :], num_top_venues)\n", | |
| "\n", | |
| "neighbourhoods_venues_sorted.head()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "## Cluster the Neighborhoods" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 50, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "array([0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 4, 0, 0, 0, 0, 0,\n", | |
| " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 1, 0, 0,\n", | |
| " 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0,\n", | |
| " 0, 2, 0, 0, 0, 0, 4, 0, 2, 0, 3, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0,\n", | |
| " 4, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1], dtype=int32)" | |
| ] | |
| }, | |
| "execution_count": 50, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "# Run k-means to cluster the neighborhood into 5 clusters.\n", | |
| "kclusters = 5\n", | |
| "\n", | |
| "toronto_grouped_clustering = toronto_grouped.drop('Neighbourhood', 1)\n", | |
| "\n", | |
| "# run k-means clustering\n", | |
| "kmeans = KMeans(n_clusters=kclusters, random_state=0).fit(toronto_grouped_clustering)\n", | |
| "\n", | |
| "# check cluster labels generated for each row in the dataframe\n", | |
| "kmeans.labels_ \n", | |
| "# to change use .astype()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 51, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<div>\n", | |
| "<style scoped>\n", | |
| " .dataframe tbody tr th:only-of-type {\n", | |
| " vertical-align: middle;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe tbody tr th {\n", | |
| " vertical-align: top;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe thead th {\n", | |
| " text-align: right;\n", | |
| " }\n", | |
| "</style>\n", | |
| "<table border=\"1\" class=\"dataframe\">\n", | |
| " <thead>\n", | |
| " <tr style=\"text-align: right;\">\n", | |
| " <th></th>\n", | |
| " <th>Postalcode</th>\n", | |
| " <th>Borough</th>\n", | |
| " <th>Neighbourhood</th>\n", | |
| " <th>Latitude</th>\n", | |
| " <th>Longitude</th>\n", | |
| " <th>Cluster_Labels</th>\n", | |
| " <th>1st Most Common Venue</th>\n", | |
| " <th>2nd Most Common Venue</th>\n", | |
| " <th>3rd Most Common Venue</th>\n", | |
| " <th>4th Most Common Venue</th>\n", | |
| " <th>5th Most Common Venue</th>\n", | |
| " <th>6th Most Common Venue</th>\n", | |
| " <th>7th Most Common Venue</th>\n", | |
| " <th>8th Most Common Venue</th>\n", | |
| " <th>9th Most Common Venue</th>\n", | |
| " <th>10th Most Common Venue</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>0</th>\n", | |
| " <td>M3A</td>\n", | |
| " <td>North York</td>\n", | |
| " <td>Parkwoods</td>\n", | |
| " <td>43.753259</td>\n", | |
| " <td>-79.329656</td>\n", | |
| " <td>4.0</td>\n", | |
| " <td>Fast Food Restaurant</td>\n", | |
| " <td>Park</td>\n", | |
| " <td>Food & Drink Shop</td>\n", | |
| " <td>Eastern European Restaurant</td>\n", | |
| " <td>Discount Store</td>\n", | |
| " <td>Dog Run</td>\n", | |
| " <td>Doner Restaurant</td>\n", | |
| " <td>Donut Shop</td>\n", | |
| " <td>Drugstore</td>\n", | |
| " <td>Dumpling Restaurant</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>1</th>\n", | |
| " <td>M4A</td>\n", | |
| " <td>North York</td>\n", | |
| " <td>Victoria Village</td>\n", | |
| " <td>43.725882</td>\n", | |
| " <td>-79.315572</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>Intersection</td>\n", | |
| " <td>Hockey Arena</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " <td>Portuguese Restaurant</td>\n", | |
| " <td>Pizza Place</td>\n", | |
| " <td>Event Space</td>\n", | |
| " <td>Ethiopian Restaurant</td>\n", | |
| " <td>Empanada Restaurant</td>\n", | |
| " <td>Falafel Restaurant</td>\n", | |
| " <td>Electronics Store</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>2</th>\n", | |
| " <td>M5A</td>\n", | |
| " <td>Downtown Toronto</td>\n", | |
| " <td>Harbourfront, Regent Park</td>\n", | |
| " <td>43.654260</td>\n", | |
| " <td>-79.360636</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " <td>Pub</td>\n", | |
| " <td>Bakery</td>\n", | |
| " <td>Park</td>\n", | |
| " <td>Mexican Restaurant</td>\n", | |
| " <td>Theater</td>\n", | |
| " <td>Breakfast Spot</td>\n", | |
| " <td>Café</td>\n", | |
| " <td>Gym / Fitness Center</td>\n", | |
| " <td>Health Food Store</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>3</th>\n", | |
| " <td>M6A</td>\n", | |
| " <td>North York</td>\n", | |
| " <td>Lawrence Heights, Lawrence Manor</td>\n", | |
| " <td>43.718518</td>\n", | |
| " <td>-79.464763</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>Clothing Store</td>\n", | |
| " <td>Furniture / Home Store</td>\n", | |
| " <td>Women's Store</td>\n", | |
| " <td>Boutique</td>\n", | |
| " <td>Gift Shop</td>\n", | |
| " <td>Event Space</td>\n", | |
| " <td>Miscellaneous Shop</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " <td>Accessories Store</td>\n", | |
| " <td>Vietnamese Restaurant</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>4</th>\n", | |
| " <td>M7A</td>\n", | |
| " <td>Queen's Park</td>\n", | |
| " <td>Queen's Park</td>\n", | |
| " <td>43.662301</td>\n", | |
| " <td>-79.389494</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " <td>Gym</td>\n", | |
| " <td>Japanese Restaurant</td>\n", | |
| " <td>Sushi Restaurant</td>\n", | |
| " <td>Park</td>\n", | |
| " <td>Persian Restaurant</td>\n", | |
| " <td>Smoothie Shop</td>\n", | |
| " <td>Seafood Restaurant</td>\n", | |
| " <td>Sandwich Place</td>\n", | |
| " <td>Burger Joint</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " Postalcode Borough Neighbourhood Latitude \\\n", | |
| "0 M3A North York Parkwoods 43.753259 \n", | |
| "1 M4A North York Victoria Village 43.725882 \n", | |
| "2 M5A Downtown Toronto Harbourfront, Regent Park 43.654260 \n", | |
| "3 M6A North York Lawrence Heights, Lawrence Manor 43.718518 \n", | |
| "4 M7A Queen's Park Queen's Park 43.662301 \n", | |
| "\n", | |
| " Longitude Cluster_Labels 1st Most Common Venue 2nd Most Common Venue \\\n", | |
| "0 -79.329656 4.0 Fast Food Restaurant Park \n", | |
| "1 -79.315572 0.0 Intersection Hockey Arena \n", | |
| "2 -79.360636 0.0 Coffee Shop Pub \n", | |
| "3 -79.464763 0.0 Clothing Store Furniture / Home Store \n", | |
| "4 -79.389494 0.0 Coffee Shop Gym \n", | |
| "\n", | |
| " 3rd Most Common Venue 4th Most Common Venue 5th Most Common Venue \\\n", | |
| "0 Food & Drink Shop Eastern European Restaurant Discount Store \n", | |
| "1 Coffee Shop Portuguese Restaurant Pizza Place \n", | |
| "2 Bakery Park Mexican Restaurant \n", | |
| "3 Women's Store Boutique Gift Shop \n", | |
| "4 Japanese Restaurant Sushi Restaurant Park \n", | |
| "\n", | |
| " 6th Most Common Venue 7th Most Common Venue 8th Most Common Venue \\\n", | |
| "0 Dog Run Doner Restaurant Donut Shop \n", | |
| "1 Event Space Ethiopian Restaurant Empanada Restaurant \n", | |
| "2 Theater Breakfast Spot Café \n", | |
| "3 Event Space Miscellaneous Shop Coffee Shop \n", | |
| "4 Persian Restaurant Smoothie Shop Seafood Restaurant \n", | |
| "\n", | |
| " 9th Most Common Venue 10th Most Common Venue \n", | |
| "0 Drugstore Dumpling Restaurant \n", | |
| "1 Falafel Restaurant Electronics Store \n", | |
| "2 Gym / Fitness Center Health Food Store \n", | |
| "3 Accessories Store Vietnamese Restaurant \n", | |
| "4 Sandwich Place Burger Joint " | |
| ] | |
| }, | |
| "execution_count": 51, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "# create a new dataframe that includes the cluster as well as the top 10 venues for each neighborhood.\n", | |
| "neighbourhoods_venues_sorted.insert(0, 'Cluster_Labels', kmeans.labels_)\n", | |
| "\n", | |
| "toronto_merged = Toronto_df\n", | |
| "\n", | |
| "# merge toronto_grouped with toronto_data to add latitude/longitude for each neighborhood\n", | |
| "toronto_merged = toronto_merged.join(neighbourhoods_venues_sorted.set_index('Neighbourhood'), on='Neighbourhood')\n", | |
| "\n", | |
| "toronto_merged.head() # check the last columns!" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "## there is no data available for some neighbourhood droping that row" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 52, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "toronto_merged=toronto_merged.dropna()\n", | |
| "toronto_merged['Cluster_Labels'] = toronto_merged.Cluster_Labels.astype(int)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 53, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfNmI0NjQyZGFjODhiNDNkOGFkODc3NDRlMTVjNDkyNDkgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzZiNDY0MmRhYzg4YjQzZDhhZDg3NzQ0ZTE1YzQ5MjQ5IiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF82YjQ2NDJkYWM4OGI0M2Q4YWQ4Nzc0NGUxNWM0OTI0OSA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF82YjQ2NDJkYWM4OGI0M2Q4YWQ4Nzc0NGUxNWM0OTI0OScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbNDMuNjUzOTYzLC03OS4zODcyMDddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbTogMTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhCb3VuZHM6IGJvdW5kcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyczogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZENvcHlKdW1wOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciB0aWxlX2xheWVyX2I3ZTQxOWIzYmUwNTQ0ODdiYjUxNzYwNDE5NTk2NTdjID0gTC50aWxlTGF5ZXIoCiAgICAgICAgICAgICAgICAnaHR0cHM6Ly97c30udGlsZS5vcGVuc3RyZWV0bWFwLm9yZy97en0ve3h9L3t5fS5wbmcnLAogICAgICAgICAgICAgICAgewogICJhdHRyaWJ1dGlvbiI6IG51bGwsCiAgImRldGVjdFJldGluYSI6IGZhbHNlLAogICJtYXhab29tIjogMTgsCiAgIm1pblpvb20iOiAxLAogICJub1dyYXAiOiBmYWxzZSwKICAic3ViZG9tYWlucyI6ICJhYmMiCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzZiNDY0MmRhYzg4YjQzZDhhZDg3NzQ0ZTE1YzQ5MjQ5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iODg2N2Q1ODc3OTU0ZmJlODZmNWUyYTBlNmFhY2FhYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc1MzI1ODYsLTc5LjMyOTY1NjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmYjM2MCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZmIzNjAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNmI0NjQyZGFjODhiNDNkOGFkODc3NDRlMTVjNDkyNDkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDhmOWUwYjA3ZDRmNDM5YTllZmM3ZjhlMDJmZTc0MGUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzIxM2IzNjg4ZTliNGIyMjk0NTFhZGMyMDRhZjZkYjMgPSAkKCc8ZGl2IGlkPSJodG1sXzMyMTNiMzY4OGU5YjRiMjI5NDUxYWRjMjA0YWY2ZGIzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QYXJrd29vZHMgQ2x1c3RlciA0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80OGY5ZTBiMDdkNGY0MzlhOWVmYzdmOGUwMmZlNzQwZS5zZXRDb250ZW50KGh0bWxfMzIxM2IzNjg4ZTliNGIyMjk0NTFhZGMyMDRhZjZkYjMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjg4NjdkNTg3Nzk1NGZiZTg2ZjVlMmEwZTZhYWNhYWIuYmluZFBvcHVwKHBvcHVwXzQ4ZjllMGIwN2Q0ZjQzOWE5ZWZjN2Y4ZTAyZmU3NDBlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2E5OWI3ZjQ4NGI4YTRkZWE5NzMyN2ZkYjhmMGJlZDdjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzI1ODgyMjk5OTk5OTk1LC03OS4zMTU1NzE1OTk5OTk5OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82YjQ2NDJkYWM4OGI0M2Q4YWQ4Nzc0NGUxNWM0OTI0OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85YTUxNzkxMjJmYTk0MGMyOGU4MjEyZWE2YTJjNGFiYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mZDI0YWUyOTQwMzk0NGY3Yjk1OTI4MGIzOGU3NGY1YiA9ICQoJzxkaXYgaWQ9Imh0bWxfZmQyNGFlMjk0MDM5NDRmN2I5NTkyODBiMzhlNzRmNWIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlZpY3RvcmlhIFZpbGxhZ2UgQ2x1c3RlciAwPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85YTUxNzkxMjJmYTk0MGMyOGU4MjEyZWE2YTJjNGFiYi5zZXRDb250ZW50KGh0bWxfZmQyNGFlMjk0MDM5NDRmN2I5NTkyODBiMzhlNzRmNWIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTk5YjdmNDg0YjhhNGRlYTk3MzI3ZmRiOGYwYmVkN2MuYmluZFBvcHVwKHBvcHVwXzlhNTE3OTEyMmZhOTQwYzI4ZTgyMTJlYTZhMmM0YWJiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzkyY2U4ZDA2ZTgzZTQ5MjA4YThhY2U5YjI5N2Y1NjAyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjU0MjU5OSwtNzkuMzYwNjM1OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82YjQ2NDJkYWM4OGI0M2Q4YWQ4Nzc0NGUxNWM0OTI0OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kMWFlNGY0MGQwZTk0M2ZlYmQ1NTA1OWI5NzJkNzUxZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82YWQ2YzM3NDk2ZWQ0YjBlYmE4ZmI5ZDI4ZWU0MjdiZSA9ICQoJzxkaXYgaWQ9Imh0bWxfNmFkNmMzNzQ5NmVkNGIwZWJhOGZiOWQyOGVlNDI3YmUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkhhcmJvdXJmcm9udCwgUmVnZW50IFBhcmsgQ2x1c3RlciAwPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kMWFlNGY0MGQwZTk0M2ZlYmQ1NTA1OWI5NzJkNzUxZS5zZXRDb250ZW50KGh0bWxfNmFkNmMzNzQ5NmVkNGIwZWJhOGZiOWQyOGVlNDI3YmUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTJjZThkMDZlODNlNDkyMDhhOGFjZTliMjk3ZjU2MDIuYmluZFBvcHVwKHBvcHVwX2QxYWU0ZjQwZDBlOTQzZmViZDU1MDU5Yjk3MmQ3NTFlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzM1ZjM5NmE3ZWI4YTQ0YzFhYWRlZDY2NjM0YTc5NzIxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzE4NTE3OTk5OTk5OTk2LC03OS40NjQ3NjMyOTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82YjQ2NDJkYWM4OGI0M2Q4YWQ4Nzc0NGUxNWM0OTI0OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zNjg4OWJkNTAwMDI0NjA4ODhjODlhYjNmNDk2ZTMzYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80NGQwZTczMDFjZjU0M2MzYjUyMWEzZGMyZjAyNGVjOSA9ICQoJzxkaXYgaWQ9Imh0bWxfNDRkMGU3MzAxY2Y1NDNjM2I1MjFhM2RjMmYwMjRlYzkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxhd3JlbmNlIEhlaWdodHMsIExhd3JlbmNlIE1hbm9yIENsdXN0ZXIgMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzY4ODliZDUwMDAyNDYwODg4Yzg5YWIzZjQ5NmUzM2Euc2V0Q29udGVudChodG1sXzQ0ZDBlNzMwMWNmNTQzYzNiNTIxYTNkYzJmMDI0ZWM5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzM1ZjM5NmE3ZWI4YTQ0YzFhYWRlZDY2NjM0YTc5NzIxLmJpbmRQb3B1cChwb3B1cF8zNjg4OWJkNTAwMDI0NjA4ODhjODlhYjNmNDk2ZTMzYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yNjkyNjhiZDdmOWY0MmY2ODUxMzg2YWI4YzNhMDJiMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY2MjMwMTUsLTc5LjM4OTQ5MzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNmI0NjQyZGFjODhiNDNkOGFkODc3NDRlMTVjNDkyNDkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjc2M2UzN2E0YjYxNDVmZWEwNWZkZTk1MjU2ZWRkOTMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjQ0YTgxZDFhMGI2NDMyYmI3YjA1YzkwNThkYWE2YjkgPSAkKCc8ZGl2IGlkPSJodG1sX2Y0NGE4MWQxYTBiNjQzMmJiN2IwNWM5MDU4ZGFhNmI5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5RdWVlbiYjMzk7cyBQYXJrIENsdXN0ZXIgMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjc2M2UzN2E0YjYxNDVmZWEwNWZkZTk1MjU2ZWRkOTMuc2V0Q29udGVudChodG1sX2Y0NGE4MWQxYTBiNjQzMmJiN2IwNWM5MDU4ZGFhNmI5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzI2OTI2OGJkN2Y5ZjQyZjY4NTEzODZhYjhjM2EwMmIwLmJpbmRQb3B1cChwb3B1cF8yNzYzZTM3YTRiNjE0NWZlYTA1ZmRlOTUyNTZlZGQ5Myk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mZGViOTgxNDYxOWY0ZGU4ODA5MjkwN2M1MjNhNzg3YSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjgwNjY4NjI5OTk5OTk5NiwtNzkuMTk0MzUzNDAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzgwZmZiNCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiM4MGZmYjQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNmI0NjQyZGFjODhiNDNkOGFkODc3NDRlMTVjNDkyNDkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzdkYWRmYzdlMzZhNGY3ZWI4ZWE1NmMwZWIwMzQxMTEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjIyYzAxYTQ1NGQ3NDVhOTg1OWNlMjY2ODA2NGQ5NDQgPSAkKCc8ZGl2IGlkPSJodG1sXzIyMmMwMWE0NTRkNzQ1YTk4NTljZTI2NjgwNjRkOTQ0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Sb3VnZSwgTWFsdmVybiBDbHVzdGVyIDM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2M3ZGFkZmM3ZTM2YTRmN2ViOGVhNTZjMGViMDM0MTExLnNldENvbnRlbnQoaHRtbF8yMjJjMDFhNDU0ZDc0NWE5ODU5Y2UyNjY4MDY0ZDk0NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mZGViOTgxNDYxOWY0ZGU4ODA5MjkwN2M1MjNhNzg3YS5iaW5kUG9wdXAocG9wdXBfYzdkYWRmYzdlMzZhNGY3ZWI4ZWE1NmMwZWIwMzQxMTEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZWY4OTY1YWM2ZTZjNDM4ODk4OWZlM2QyZGQ1YzVjMjAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43NDU5MDU3OTk5OTk5OTYsLTc5LjM1MjE4OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82YjQ2NDJkYWM4OGI0M2Q4YWQ4Nzc0NGUxNWM0OTI0OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lMzdkNWUyZjEyYjE0ZDZlOGMyNjFiMmQyOTNiMjllYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zNzBjNTNlNGI5YTk0MGUxYjE3ZDUxZjg2NWEzN2ExMSA9ICQoJzxkaXYgaWQ9Imh0bWxfMzcwYzUzZTRiOWE5NDBlMWIxN2Q1MWY4NjVhMzdhMTEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRvbiBNaWxscyBOb3J0aCBDbHVzdGVyIDA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2UzN2Q1ZTJmMTJiMTRkNmU4YzI2MWIyZDI5M2IyOWVjLnNldENvbnRlbnQoaHRtbF8zNzBjNTNlNGI5YTk0MGUxYjE3ZDUxZjg2NWEzN2ExMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lZjg5NjVhYzZlNmM0Mzg4OTg5ZmUzZDJkZDVjNWMyMC5iaW5kUG9wdXAocG9wdXBfZTM3ZDVlMmYxMmIxNGQ2ZThjMjYxYjJkMjkzYjI5ZWMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTUxYzY4NWRmYzk5NGMzYjliNzZjMmUwYzRlMjI5MDkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MDYzOTcyLC03OS4zMDk5MzddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNmI0NjQyZGFjODhiNDNkOGFkODc3NDRlMTVjNDkyNDkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmZmY2UyOWMyMGVjNGRkOTkzZWUxODk1MTE1Y2UyNDUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzZlZjQyZDhmMDZhNGI3MWFmYzQzZTUxNzI2NjI1MDIgPSAkKCc8ZGl2IGlkPSJodG1sXzc2ZWY0MmQ4ZjA2YTRiNzFhZmM0M2U1MTcyNjYyNTAyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Xb29kYmluZSBHYXJkZW5zLCBQYXJrdmlldyBIaWxsIENsdXN0ZXIgMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYmZmY2UyOWMyMGVjNGRkOTkzZWUxODk1MTE1Y2UyNDUuc2V0Q29udGVudChodG1sXzc2ZWY0MmQ4ZjA2YTRiNzFhZmM0M2U1MTcyNjYyNTAyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzk1MWM2ODVkZmM5OTRjM2I5Yjc2YzJlMGM0ZTIyOTA5LmJpbmRQb3B1cChwb3B1cF9iZmZjZTI5YzIwZWM0ZGQ5OTNlZTE4OTUxMTVjZTI0NSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hNTVjNmUzZDc0Zjk0OGRhYTU0OGU5YmE3YWYzNDdiNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY1NzE2MTgsLTc5LjM3ODkzNzA5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzZiNDY0MmRhYzg4YjQzZDhhZDg3NzQ0ZTE1YzQ5MjQ5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E4M2IyYzA0ZjEzZTQwNDBiNDBjNjY4Zjk2ZDUzZWM5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FiODU5OWQ3NzU1MDRmODM4YWJhN2MyN2ViODE0NWVkID0gJCgnPGRpdiBpZD0iaHRtbF9hYjg1OTlkNzc1NTA0ZjgzOGFiYTdjMjdlYjgxNDVlZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UnllcnNvbiwgR2FyZGVuIERpc3RyaWN0IENsdXN0ZXIgMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTgzYjJjMDRmMTNlNDA0MGI0MGM2NjhmOTZkNTNlYzkuc2V0Q29udGVudChodG1sX2FiODU5OWQ3NzU1MDRmODM4YWJhN2MyN2ViODE0NWVkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2E1NWM2ZTNkNzRmOTQ4ZGFhNTQ4ZTliYTdhZjM0N2I0LmJpbmRQb3B1cChwb3B1cF9hODNiMmMwNGYxM2U0MDQwYjQwYzY2OGY5NmQ1M2VjOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jYTZlNzcxZDY3MTE0MGE1YjE2YWVkOGNlMjg0MDUwNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcwOTU3NywtNzkuNDQ1MDcyNTk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmYjM2MCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZmIzNjAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNmI0NjQyZGFjODhiNDNkOGFkODc3NDRlMTVjNDkyNDkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmVlODI0MTQzNGI4NDBlYThiYWViNTczODM1OWIzMTggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjRmMGFjNjFjYzNlNDcwNTkxNWRiZDZjOGFmMTlmNmYgPSAkKCc8ZGl2IGlkPSJodG1sX2Y0ZjBhYzYxY2MzZTQ3MDU5MTVkYmQ2YzhhZjE5ZjZmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HbGVuY2Fpcm4gQ2x1c3RlciA0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82ZWU4MjQxNDM0Yjg0MGVhOGJhZWI1NzM4MzU5YjMxOC5zZXRDb250ZW50KGh0bWxfZjRmMGFjNjFjYzNlNDcwNTkxNWRiZDZjOGFmMTlmNmYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfY2E2ZTc3MWQ2NzExNDBhNWIxNmFlZDhjZTI4NDA1MDQuYmluZFBvcHVwKHBvcHVwXzZlZTgyNDE0MzRiODQwZWE4YmFlYjU3MzgzNTliMzE4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzZmYmM3YzAyNjFmYjQzN2U5ZGRkNGM1YWVjMTgyM2FlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjUwOTQzMiwtNzkuNTU0NzI0NDAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNmI0NjQyZGFjODhiNDNkOGFkODc3NDRlMTVjNDkyNDkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOWI1YTQxYWQxYjFmNGQxMGFiNTZhOTdlMWJkYjBhYTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTEyODg2ODQzOTljNDI5N2I0NWEzZTFmYjJlNTZiODYgPSAkKCc8ZGl2IGlkPSJodG1sXzkxMjg4Njg0Mzk5YzQyOTdiNDVhM2UxZmIyZTU2Yjg2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DbG92ZXJkYWxlLCBJc2xpbmd0b24sIE1hcnRpbiBHcm92ZSwgUHJpbmNlc3MgR2FyZGVucywgV2VzdCBEZWFuZSBQYXJrIENsdXN0ZXIgMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOWI1YTQxYWQxYjFmNGQxMGFiNTZhOTdlMWJkYjBhYTUuc2V0Q29udGVudChodG1sXzkxMjg4Njg0Mzk5YzQyOTdiNDVhM2UxZmIyZTU2Yjg2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzZmYmM3YzAyNjFmYjQzN2U5ZGRkNGM1YWVjMTgyM2FlLmJpbmRQb3B1cChwb3B1cF85YjVhNDFhZDFiMWY0ZDEwYWI1NmE5N2UxYmRiMGFhNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hNzMzYTFlYjk1Y2U0ZjEwYjMxMjhkYzNhZTMyN2MwOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc4NDUzNTEsLTc5LjE2MDQ5NzA5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzZiNDY0MmRhYzg4YjQzZDhhZDg3NzQ0ZTE1YzQ5MjQ5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQyZmVjMTQ1NTZjOTQ4ZmI4ZmI4ZjM0MzliZWQ0MGQzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg2MmNhYzRlNjgyZjRjZWQ5Y2FiZWZiMWUxZDQyZTdhID0gJCgnPGRpdiBpZD0iaHRtbF84NjJjYWM0ZTY4MmY0Y2VkOWNhYmVmYjFlMWQ0MmU3YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SGlnaGxhbmQgQ3JlZWssIFJvdWdlIEhpbGwsIFBvcnQgVW5pb24gQ2x1c3RlciAwPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80MmZlYzE0NTU2Yzk0OGZiOGZiOGYzNDM5YmVkNDBkMy5zZXRDb250ZW50KGh0bWxfODYyY2FjNGU2ODJmNGNlZDljYWJlZmIxZTFkNDJlN2EpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTczM2ExZWI5NWNlNGYxMGIzMTI4ZGMzYWUzMjdjMDkuYmluZFBvcHVwKHBvcHVwXzQyZmVjMTQ1NTZjOTQ4ZmI4ZmI4ZjM0MzliZWQ0MGQzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzRhZTNlYzUxMmIwNDRhNjlhYzg3MzMxMjE3NDIyZDRlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzI1ODk5NzAwMDAwMDEsLTc5LjM0MDkyM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82YjQ2NDJkYWM4OGI0M2Q4YWQ4Nzc0NGUxNWM0OTI0OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zNzk3NTUwYmQ2ZjI0MzllOTRiMWEzY2Y0OGQ5ODU5OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zOGNlNmI4ZmU3NWY0YWNmOWJjZDk0ZDllMTU5MzQ0ZSA9ICQoJzxkaXYgaWQ9Imh0bWxfMzhjZTZiOGZlNzVmNGFjZjliY2Q5NGQ5ZTE1OTM0NGUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZsZW1pbmdkb24gUGFyaywgRG9uIE1pbGxzIFNvdXRoIENsdXN0ZXIgMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzc5NzU1MGJkNmYyNDM5ZTk0YjFhM2NmNDhkOTg1OTguc2V0Q29udGVudChodG1sXzM4Y2U2YjhmZTc1ZjRhY2Y5YmNkOTRkOWUxNTkzNDRlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzRhZTNlYzUxMmIwNDRhNjlhYzg3MzMxMjE3NDIyZDRlLmJpbmRQb3B1cChwb3B1cF8zNzk3NTUwYmQ2ZjI0MzllOTRiMWEzY2Y0OGQ5ODU5OCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lZmZlZTU0NTAzYmE0ZTJiYmZkOGQyNjE0MDJmOGJhNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY5NTM0MzkwMDAwMDAwNSwtNzkuMzE4Mzg4N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82YjQ2NDJkYWM4OGI0M2Q4YWQ4Nzc0NGUxNWM0OTI0OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yYTQxNjM0MmRjYzg0OWI4OTlmYmRhMTA2ZTRlNTliMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hYmY1MjlkMGM5OTM0YmU0OTk1YWQ4NmE3MGY2YzE3YyA9ICQoJzxkaXYgaWQ9Imh0bWxfYWJmNTI5ZDBjOTkzNGJlNDk5NWFkODZhNzBmNmMxN2MiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldvb2RiaW5lIEhlaWdodHMgQ2x1c3RlciAwPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yYTQxNjM0MmRjYzg0OWI4OTlmYmRhMTA2ZTRlNTliMi5zZXRDb250ZW50KGh0bWxfYWJmNTI5ZDBjOTkzNGJlNDk5NWFkODZhNzBmNmMxN2MpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZWZmZWU1NDUwM2JhNGUyYmJmZDhkMjYxNDAyZjhiYTQuYmluZFBvcHVwKHBvcHVwXzJhNDE2MzQyZGNjODQ5Yjg5OWZiZGExMDZlNGU1OWIyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzljNjYwMWQwMWJlNjQyMWE4NmRiM2NjMmE0MWZjMGZjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjUxNDkzOSwtNzkuMzc1NDE3OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82YjQ2NDJkYWM4OGI0M2Q4YWQ4Nzc0NGUxNWM0OTI0OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yYjVjZGVlMjJjM2I0NTViYWE1YTNjMzQ0Y2JhZTA5MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wZDc4ZWMyY2QzMDU0NDc3YmU3M2QyYzdjYWM1ZDNlZiA9ICQoJzxkaXYgaWQ9Imh0bWxfMGQ3OGVjMmNkMzA1NDQ3N2JlNzNkMmM3Y2FjNWQzZWYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlN0LiBKYW1lcyBUb3duIENsdXN0ZXIgMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMmI1Y2RlZTIyYzNiNDU1YmFhNWEzYzM0NGNiYWUwOTIuc2V0Q29udGVudChodG1sXzBkNzhlYzJjZDMwNTQ0NzdiZTczZDJjN2NhYzVkM2VmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzljNjYwMWQwMWJlNjQyMWE4NmRiM2NjMmE0MWZjMGZjLmJpbmRQb3B1cChwb3B1cF8yYjVjZGVlMjJjM2I0NTViYWE1YTNjMzQ0Y2JhZTA5Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83Y2QxNzUxNDBjZmE0OTNkYTBlNWFjYjU4YmY5NmEzNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY5Mzc4MTMsLTc5LjQyODE5MTQwMDAwMDAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzZiNDY0MmRhYzg4YjQzZDhhZDg3NzQ0ZTE1YzQ5MjQ5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzJlMjZkNzJlNmQ2NzRmMzY5OTJiMTg5MjM5M2Q5YmIzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc2YmIxNjYxYWY4ZDRjNzA4Mjk0ZGRlODJhYzQzY2VmID0gJCgnPGRpdiBpZD0iaHRtbF83NmJiMTY2MWFmOGQ0YzcwODI5NGRkZTgyYWM0M2NlZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SHVtZXdvb2QtQ2VkYXJ2YWxlIENsdXN0ZXIgMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMmUyNmQ3MmU2ZDY3NGYzNjk5MmIxODkyMzkzZDliYjMuc2V0Q29udGVudChodG1sXzc2YmIxNjYxYWY4ZDRjNzA4Mjk0ZGRlODJhYzQzY2VmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzdjZDE3NTE0MGNmYTQ5M2RhMGU1YWNiNThiZjk2YTM0LmJpbmRQb3B1cChwb3B1cF8yZTI2ZDcyZTZkNjc0ZjM2OTkyYjE4OTIzOTNkOWJiMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83NTQ2ZDlkNjBjOWI0NjQ2OWYzZjQzOTM0ZTk0Zjk5OCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY0MzUxNTIsLTc5LjU3NzIwMDc5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzZiNDY0MmRhYzg4YjQzZDhhZDg3NzQ0ZTE1YzQ5MjQ5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzkzNDAzY2IxYjEyYTQ1NWY4ODBiMDM4OGI4NjU5ZjdmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzAzOTM2YWZlY2VjZjRhMmVhZGNhNmJiMjg3ZmJjYzc0ID0gJCgnPGRpdiBpZD0iaHRtbF8wMzkzNmFmZWNlY2Y0YTJlYWRjYTZiYjI4N2ZiY2M3NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Qmxvb3JkYWxlIEdhcmRlbnMsIEVyaW5nYXRlLCBNYXJrbGFuZCBXb29kLCBPbGQgQnVybmhhbXRob3JwZSBDbHVzdGVyIDA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzkzNDAzY2IxYjEyYTQ1NWY4ODBiMDM4OGI4NjU5ZjdmLnNldENvbnRlbnQoaHRtbF8wMzkzNmFmZWNlY2Y0YTJlYWRjYTZiYjI4N2ZiY2M3NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83NTQ2ZDlkNjBjOWI0NjQ2OWYzZjQzOTM0ZTk0Zjk5OC5iaW5kUG9wdXAocG9wdXBfOTM0MDNjYjFiMTJhNDU1Zjg4MGIwMzg4Yjg2NTlmN2YpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzYyNTZiMjk3OGU5NDQ2YWE5ODEyZTAyZmVhMmQyOGQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43NjM1NzI2LC03OS4xODg3MTE1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzZiNDY0MmRhYzg4YjQzZDhhZDg3NzQ0ZTE1YzQ5MjQ5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NhYzYxYzFiMjdkZTQ3ODQ4NGM2OWM0ZDA1NTQ4NmQ0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Y1MTUwNDM1ZTI0MDRmOTBiMTM1YTQ3NWUxYjNjOTI3ID0gJCgnPGRpdiBpZD0iaHRtbF9mNTE1MDQzNWUyNDA0ZjkwYjEzNWE0NzVlMWIzYzkyNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+R3VpbGR3b29kLCBNb3JuaW5nc2lkZSwgV2VzdCBIaWxsIENsdXN0ZXIgMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2FjNjFjMWIyN2RlNDc4NDg0YzY5YzRkMDU1NDg2ZDQuc2V0Q29udGVudChodG1sX2Y1MTUwNDM1ZTI0MDRmOTBiMTM1YTQ3NWUxYjNjOTI3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2M2MjU2YjI5NzhlOTQ0NmFhOTgxMmUwMmZlYTJkMjhkLmJpbmRQb3B1cChwb3B1cF9jYWM2MWMxYjI3ZGU0Nzg0ODRjNjljNGQwNTU0ODZkNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82OTdmOWFlZmY4Nzg0YTEzYWRjNGM1N2Q5YjljNmZkMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY3NjM1NzM5OTk5OTk5LC03OS4yOTMwMzEyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzZiNDY0MmRhYzg4YjQzZDhhZDg3NzQ0ZTE1YzQ5MjQ5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2IwYTdhYzI1NjYzOTQ5MGNhZjAwYTI2YjBjNDhjZDczID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E0Y2U0ZjE3ZjQ4NzQzNWQ5M2E4NmI5ZTNkNjRkNmVlID0gJCgnPGRpdiBpZD0iaHRtbF9hNGNlNGYxN2Y0ODc0MzVkOTNhODZiOWUzZDY0ZDZlZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VGhlIEJlYWNoZXMgQ2x1c3RlciAwPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iMGE3YWMyNTY2Mzk0OTBjYWYwMGEyNmIwYzQ4Y2Q3My5zZXRDb250ZW50KGh0bWxfYTRjZTRmMTdmNDg3NDM1ZDkzYTg2YjllM2Q2NGQ2ZWUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjk3ZjlhZWZmODc4NGExM2FkYzRjNTdkOWI5YzZmZDAuYmluZFBvcHVwKHBvcHVwX2IwYTdhYzI1NjYzOTQ5MGNhZjAwYTI2YjBjNDhjZDczKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzliMTQxMmRhYTZjNTRkNzNiNDUxYjhkMDA0NzgyNWJkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjQ0NzcwNzk5OTk5OTk2LC03OS4zNzMzMDY0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzZiNDY0MmRhYzg4YjQzZDhhZDg3NzQ0ZTE1YzQ5MjQ5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2I3NzY0NmNjM2VhZjQyZTRhNjM2MDg2NmY4YjY1NGYzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2VmNjI1OWEyYWMwNTQwYjA4ZmE1YzhmMzFhOGRhOTEwID0gJCgnPGRpdiBpZD0iaHRtbF9lZjYyNTlhMmFjMDU0MGIwOGZhNWM4ZjMxYThkYTkxMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmVyY3p5IFBhcmsgQ2x1c3RlciAwPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iNzc2NDZjYzNlYWY0MmU0YTYzNjA4NjZmOGI2NTRmMy5zZXRDb250ZW50KGh0bWxfZWY2MjU5YTJhYzA1NDBiMDhmYTVjOGYzMWE4ZGE5MTApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOWIxNDEyZGFhNmM1NGQ3M2I0NTFiOGQwMDQ3ODI1YmQuYmluZFBvcHVwKHBvcHVwX2I3NzY0NmNjM2VhZjQyZTRhNjM2MDg2NmY4YjY1NGYzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzllZGUxNGIxY2MxZDQxMWU4ZjE4N2JmZjY1ZWY1MTk5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjg5MDI1NiwtNzkuNDUzNTEyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZmIzNjAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmZiMzYwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzZiNDY0MmRhYzg4YjQzZDhhZDg3NzQ0ZTE1YzQ5MjQ5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzlkYTMzOWNkZTBjMDQzYzY4ODc2NjkwZmI0MTZhNDFkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E5ZWZhZTY0MzM0OTRjOWY5Y2JmMjM5MmYyN2U3YjRlID0gJCgnPGRpdiBpZD0iaHRtbF9hOWVmYWU2NDMzNDk0YzlmOWNiZjIzOTJmMjdlN2I0ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2FsZWRvbmlhLUZhaXJiYW5rcyBDbHVzdGVyIDQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzlkYTMzOWNkZTBjMDQzYzY4ODc2NjkwZmI0MTZhNDFkLnNldENvbnRlbnQoaHRtbF9hOWVmYWU2NDMzNDk0YzlmOWNiZjIzOTJmMjdlN2I0ZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85ZWRlMTRiMWNjMWQ0MTFlOGYxODdiZmY2NWVmNTE5OS5iaW5kUG9wdXAocG9wdXBfOWRhMzM5Y2RlMGMwNDNjNjg4NzY2OTBmYjQxNmE0MWQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjQzYmI4NzA1Y2YzNDIwYWJkMjY1MjU5MTU4YzI0ZGUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43NzA5OTIxLC03OS4yMTY5MTc0MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82YjQ2NDJkYWM4OGI0M2Q4YWQ4Nzc0NGUxNWM0OTI0OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iMjYwMjFhNjAxNGE0ODEyOTU3YzdjMjc1ODIxMzJjMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xZWQ1YjE1NjVmMTA0NDQ5ODQ0ZTdlNDI3NjEzOTg4NiA9ICQoJzxkaXYgaWQ9Imh0bWxfMWVkNWIxNTY1ZjEwNDQ0OTg0NGU3ZTQyNzYxMzk4ODYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldvYnVybiBDbHVzdGVyIDA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2IyNjAyMWE2MDE0YTQ4MTI5NTdjN2MyNzU4MjEzMmMyLnNldENvbnRlbnQoaHRtbF8xZWQ1YjE1NjVmMTA0NDQ5ODQ0ZTdlNDI3NjEzOTg4Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mNDNiYjg3MDVjZjM0MjBhYmQyNjUyNTkxNThjMjRkZS5iaW5kUG9wdXAocG9wdXBfYjI2MDIxYTYwMTRhNDgxMjk1N2M3YzI3NTgyMTMyYzIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTNlZTA1MGZjMzEwNDgxZWE1OTY2MzU2YTcyZTI5MGIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MDkwNjA0LC03OS4zNjM0NTE3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzZiNDY0MmRhYzg4YjQzZDhhZDg3NzQ0ZTE1YzQ5MjQ5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzA4NzhmOWQ5MTliMzQzOWVhNTc4OTc0MzdmZDA0NGQ1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzAyMjZlM2U1NDA0ZjRmZDdiMWNkYzQ4YzI4N2U1OGI3ID0gJCgnPGRpdiBpZD0iaHRtbF8wMjI2ZTNlNTQwNGY0ZmQ3YjFjZGM0OGMyODdlNThiNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGVhc2lkZSBDbHVzdGVyIDA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA4NzhmOWQ5MTliMzQzOWVhNTc4OTc0MzdmZDA0NGQ1LnNldENvbnRlbnQoaHRtbF8wMjI2ZTNlNTQwNGY0ZmQ3YjFjZGM0OGMyODdlNThiNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81M2VlMDUwZmMzMTA0ODFlYTU5NjYzNTZhNzJlMjkwYi5iaW5kUG9wdXAocG9wdXBfMDg3OGY5ZDkxOWIzNDM5ZWE1Nzg5NzQzN2ZkMDQ0ZDUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODFhYjZhM2ZkMzI0NGIyMmI0NGM4ZDA2NGQzNzUxN2IgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NTc5NTI0LC03OS4zODczODI2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzZiNDY0MmRhYzg4YjQzZDhhZDg3NzQ0ZTE1YzQ5MjQ5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzVlZWZiZWIzYTc0NjRmMDBhNjc0YzAzZDcxMTdmZjRjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I5M2RiYzQ5OWU0OTRlOTViM2YyMTQ0YzAwMjI3YTllID0gJCgnPGRpdiBpZD0iaHRtbF9iOTNkYmM0OTllNDk0ZTk1YjNmMjE0NGMwMDIyN2E5ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2VudHJhbCBCYXkgU3RyZWV0IENsdXN0ZXIgMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNWVlZmJlYjNhNzQ2NGYwMGE2NzRjMDNkNzExN2ZmNGMuc2V0Q29udGVudChodG1sX2I5M2RiYzQ5OWU0OTRlOTViM2YyMTQ0YzAwMjI3YTllKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzgxYWI2YTNmZDMyNDRiMjJiNDRjOGQwNjRkMzc1MTdiLmJpbmRQb3B1cChwb3B1cF81ZWVmYmViM2E3NDY0ZjAwYTY3NGMwM2Q3MTE3ZmY0Yyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mY2ZhOTNiYTExNDY0YTM4YjRmMDQ0ZTg3ODVhNWRmMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY2OTU0MiwtNzkuNDIyNTYzN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82YjQ2NDJkYWM4OGI0M2Q4YWQ4Nzc0NGUxNWM0OTI0OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81OTNiZDExY2FjODY0N2FhOWIzYjViODhlZGM2NTI2MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kZWQwYzg0N2M3YzI0ZjM2OGJkMjU2OWQ4NjRjY2Q0MSA9ICQoJzxkaXYgaWQ9Imh0bWxfZGVkMGM4NDdjN2MyNGYzNjhiZDI1NjlkODY0Y2NkNDEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNocmlzdGllIENsdXN0ZXIgMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTkzYmQxMWNhYzg2NDdhYTliM2I1Yjg4ZWRjNjUyNjAuc2V0Q29udGVudChodG1sX2RlZDBjODQ3YzdjMjRmMzY4YmQyNTY5ZDg2NGNjZDQxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ZjZmE5M2JhMTE0NjRhMzhiNGYwNDRlODc4NWE1ZGYxLmJpbmRQb3B1cChwb3B1cF81OTNiZDExY2FjODY0N2FhOWIzYjViODhlZGM2NTI2MCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lYTdhNTg5ZWU3Y2I0ZDE5YTMxMDQ1MTM3NzljMTMwZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc3MzEzNiwtNzkuMjM5NDc2MDk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNmI0NjQyZGFjODhiNDNkOGFkODc3NDRlMTVjNDkyNDkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTg0N2U0ZmMwZWNiNDM3ZThiY2RmNzI2NDhiNGJkZTAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzdjZmNmZTAwMmZkNDBjOTkyZTQ5MGQzOTBmZjAzMDkgPSAkKCc8ZGl2IGlkPSJodG1sX2M3Y2ZjZmUwMDJmZDQwYzk5MmU0OTBkMzkwZmYwMzA5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DZWRhcmJyYWUgQ2x1c3RlciAwPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81ODQ3ZTRmYzBlY2I0MzdlOGJjZGY3MjY0OGI0YmRlMC5zZXRDb250ZW50KGh0bWxfYzdjZmNmZTAwMmZkNDBjOTkyZTQ5MGQzOTBmZjAzMDkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZWE3YTU4OWVlN2NiNGQxOWEzMTA0NTEzNzc5YzEzMGUuYmluZFBvcHVwKHBvcHVwXzU4NDdlNGZjMGVjYjQzN2U4YmNkZjcyNjQ4YjRiZGUwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzRmYzYxN2YwOTE2MzQ2YThhNWZjYjkzYjlhMjk4NTM3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuODAzNzYyMiwtNzkuMzYzNDUxN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82YjQ2NDJkYWM4OGI0M2Q4YWQ4Nzc0NGUxNWM0OTI0OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zYmNiZGU2YWMzYWE0N2MzYTVmOTRmNGQyZDUzMDdkZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wMDBhZGQ5OWI2ODg0MjA3OTMyNmM0MjAwYWUyMjVmMiA9ICQoJzxkaXYgaWQ9Imh0bWxfMDAwYWRkOTliNjg4NDIwNzkzMjZjNDIwMGFlMjI1ZjIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkhpbGxjcmVzdCBWaWxsYWdlIENsdXN0ZXIgMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfM2JjYmRlNmFjM2FhNDdjM2E1Zjk0ZjRkMmQ1MzA3ZGUuc2V0Q29udGVudChodG1sXzAwMGFkZDk5YjY4ODQyMDc5MzI2YzQyMDBhZTIyNWYyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzRmYzYxN2YwOTE2MzQ2YThhNWZjYjkzYjlhMjk4NTM3LmJpbmRQb3B1cChwb3B1cF8zYmNiZGU2YWMzYWE0N2MzYTVmOTRmNGQyZDUzMDdkZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xNzZlYjY1ZjZjOGM0OTJiODIzYjdmODEwMDFlZTJiMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc1NDMyODMsLTc5LjQ0MjI1OTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNmI0NjQyZGFjODhiNDNkOGFkODc3NDRlMTVjNDkyNDkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGE1OTY3YWE2ZTdlNDAyN2I1N2RhOWNkMDlkYTQ2NDMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDNjZWE2YmZhODQ3NGM1N2JlYmYyNzFlZDY0NWZkZTcgPSAkKCc8ZGl2IGlkPSJodG1sXzAzY2VhNmJmYTg0NzRjNTdiZWJmMjcxZWQ2NDVmZGU3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CYXRodXJzdCBNYW5vciwgRG93bnN2aWV3IE5vcnRoLCBXaWxzb24gSGVpZ2h0cyBDbHVzdGVyIDA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RhNTk2N2FhNmU3ZTQwMjdiNTdkYTljZDA5ZGE0NjQzLnNldENvbnRlbnQoaHRtbF8wM2NlYTZiZmE4NDc0YzU3YmViZjI3MWVkNjQ1ZmRlNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xNzZlYjY1ZjZjOGM0OTJiODIzYjdmODEwMDFlZTJiMi5iaW5kUG9wdXAocG9wdXBfZGE1OTY3YWE2ZTdlNDAyN2I1N2RhOWNkMDlkYTQ2NDMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfM2NiYjlhMjBkNzM1NDM1YTg3MjgwOWY1NTE3M2I3ZWQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MDUzNjg5LC03OS4zNDkzNzE5MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82YjQ2NDJkYWM4OGI0M2Q4YWQ4Nzc0NGUxNWM0OTI0OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kYjRlMDAzZWM1NzM0NzJmOTcxY2FkYTk0ZDEzODIzOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85MjRmMmNiOWNiNzk0NjM2YWRhYmQ1MzkxMDFiN2FhNCA9ICQoJzxkaXYgaWQ9Imh0bWxfOTI0ZjJjYjljYjc5NDYzNmFkYWJkNTM5MTAxYjdhYTQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlRob3JuY2xpZmZlIFBhcmsgQ2x1c3RlciAwPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kYjRlMDAzZWM1NzM0NzJmOTcxY2FkYTk0ZDEzODIzOC5zZXRDb250ZW50KGh0bWxfOTI0ZjJjYjljYjc5NDYzNmFkYWJkNTM5MTAxYjdhYTQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfM2NiYjlhMjBkNzM1NDM1YTg3MjgwOWY1NTE3M2I3ZWQuYmluZFBvcHVwKHBvcHVwX2RiNGUwMDNlYzU3MzQ3MmY5NzFjYWRhOTRkMTM4MjM4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzliZGIwMGY1MGU5YzRmYTY5YTExNTQ1NzlhMDZkMDA4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjUwNTcxMjAwMDAwMDEsLTc5LjM4NDU2NzVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNmI0NjQyZGFjODhiNDNkOGFkODc3NDRlMTVjNDkyNDkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODc0OGM3NWUxYWM1NDE1Nzg2NTU1NzYwOGJjMDFmOWYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWNmZDIxYWYyN2EwNDFhMjk1ZTBlNzUwNGMxNGYzNjYgPSAkKCc8ZGl2IGlkPSJodG1sXzVjZmQyMWFmMjdhMDQxYTI5NWUwZTc1MDRjMTRmMzY2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BZGVsYWlkZSwgS2luZywgUmljaG1vbmQgQ2x1c3RlciAwPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84NzQ4Yzc1ZTFhYzU0MTU3ODY1NTU3NjA4YmMwMWY5Zi5zZXRDb250ZW50KGh0bWxfNWNmZDIxYWYyN2EwNDFhMjk1ZTBlNzUwNGMxNGYzNjYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOWJkYjAwZjUwZTljNGZhNjlhMTE1NDU3OWEwNmQwMDguYmluZFBvcHVwKHBvcHVwXzg3NDhjNzVlMWFjNTQxNTc4NjU1NTc2MDhiYzAxZjlmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzRhZmMyNjYzMDY2OTRhZTM5ZjBmODMzNTUzNTI2YjA1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjY5MDA1MTAwMDAwMDEsLTc5LjQ0MjI1OTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNmI0NjQyZGFjODhiNDNkOGFkODc3NDRlMTVjNDkyNDkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTRiMzViMDdkNWIyNDE3NjhmZGQ0ZjRkNmNjZmE4YjggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmQyMDlmZDIxYThmNDRmZjgyZmQ4ZDBkNjEwZjlmZTQgPSAkKCc8ZGl2IGlkPSJodG1sX2JkMjA5ZmQyMWE4ZjQ0ZmY4MmZkOGQwZDYxMGY5ZmU0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Eb3ZlcmNvdXJ0IFZpbGxhZ2UsIER1ZmZlcmluIENsdXN0ZXIgMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTRiMzViMDdkNWIyNDE3NjhmZGQ0ZjRkNmNjZmE4Yjguc2V0Q29udGVudChodG1sX2JkMjA5ZmQyMWE4ZjQ0ZmY4MmZkOGQwZDYxMGY5ZmU0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzRhZmMyNjYzMDY2OTRhZTM5ZjBmODMzNTUzNTI2YjA1LmJpbmRQb3B1cChwb3B1cF9hNGIzNWIwN2Q1YjI0MTc2OGZkZDRmNGQ2Y2NmYThiOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hNDIyYjM4OTA0Mjg0NmViOWVmNGNmOGJlZjJiY2Q0ZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc0NDczNDIsLTc5LjIzOTQ3NjA5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMwMGI1ZWIiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMDBiNWViIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzZiNDY0MmRhYzg4YjQzZDhhZDg3NzQ0ZTE1YzQ5MjQ5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2IxYjE1YTkzOWRhNjQ1MTJhZDI1MWY4ODhkYzVkZjcwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc1YTllNDgxNzczMTQxNzdiNTE2MzllYmExMWU1ZWVmID0gJCgnPGRpdiBpZD0iaHRtbF83NWE5ZTQ4MTc3MzE0MTc3YjUxNjM5ZWJhMTFlNWVlZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U2NhcmJvcm91Z2ggVmlsbGFnZSBDbHVzdGVyIDI8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2IxYjE1YTkzOWRhNjQ1MTJhZDI1MWY4ODhkYzVkZjcwLnNldENvbnRlbnQoaHRtbF83NWE5ZTQ4MTc3MzE0MTc3YjUxNjM5ZWJhMTFlNWVlZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hNDIyYjM4OTA0Mjg0NmViOWVmNGNmOGJlZjJiY2Q0Zi5iaW5kUG9wdXAocG9wdXBfYjFiMTVhOTM5ZGE2NDUxMmFkMjUxZjg4OGRjNWRmNzApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmUwMDc0ZjQ5OTU1NDgyZDljNjQzZjAwMmYyNDcxNDcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43Nzg1MTc1LC03OS4zNDY1NTU3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzZiNDY0MmRhYzg4YjQzZDhhZDg3NzQ0ZTE1YzQ5MjQ5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2YwZjNjOGQ1ODc0MDQ3MGI4YWNhYjM4MTEwOTJjMmJlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNiNWZmOGI2Nzg5ZjRlNGJiNTQzNzc3MzE4OTVlNWQzID0gJCgnPGRpdiBpZD0iaHRtbF8zYjVmZjhiNjc4OWY0ZTRiYjU0Mzc3NzMxODk1ZTVkMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RmFpcnZpZXcsIEhlbnJ5IEZhcm0sIE9yaW9sZSBDbHVzdGVyIDA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2YwZjNjOGQ1ODc0MDQ3MGI4YWNhYjM4MTEwOTJjMmJlLnNldENvbnRlbnQoaHRtbF8zYjVmZjhiNjc4OWY0ZTRiYjU0Mzc3NzMxODk1ZTVkMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82ZTAwNzRmNDk5NTU0ODJkOWM2NDNmMDAyZjI0NzE0Ny5iaW5kUG9wdXAocG9wdXBfZjBmM2M4ZDU4NzQwNDcwYjhhY2FiMzgxMTA5MmMyYmUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzdhNTg5ZmVmMDc5NDVkY2E2NTI4MTcyM2ZkZjczODIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43Njc5ODAzLC03OS40ODcyNjE5MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82YjQ2NDJkYWM4OGI0M2Q4YWQ4Nzc0NGUxNWM0OTI0OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wMjU5Zjc0YzVhNWQ0YmM3YmU3ZWM3MjU0OTZkYmRmMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iZDdhNjFmMTQ0NzU0Njk5ODViYTNjNzQxNDEyZThiYiA9ICQoJzxkaXYgaWQ9Imh0bWxfYmQ3YTYxZjE0NDc1NDY5OTg1YmEzYzc0MTQxMmU4YmIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5vcnRod29vZCBQYXJrLCBZb3JrIFVuaXZlcnNpdHkgQ2x1c3RlciAwPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wMjU5Zjc0YzVhNWQ0YmM3YmU3ZWM3MjU0OTZkYmRmMC5zZXRDb250ZW50KGh0bWxfYmQ3YTYxZjE0NDc1NDY5OTg1YmEzYzc0MTQxMmU4YmIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzdhNTg5ZmVmMDc5NDVkY2E2NTI4MTcyM2ZkZjczODIuYmluZFBvcHVwKHBvcHVwXzAyNTlmNzRjNWE1ZDRiYzdiZTdlYzcyNTQ5NmRiZGYwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Q1N2RkZWY2M2EzYTQzMTRhM2I1YThkNDIyMWIzYzc4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjg1MzQ3LC03OS4zMzgxMDY1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiM4MDAwZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjODAwMGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzZiNDY0MmRhYzg4YjQzZDhhZDg3NzQ0ZTE1YzQ5MjQ5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg4MWYxNGE1ZDI0NDQxMjFhZjc0YjBmM2ZjM2JmZWQzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U1YzNlZmRjYjQ1YTRiODliMDNjZTU5NjgyYzliMDVjID0gJCgnPGRpdiBpZD0iaHRtbF9lNWMzZWZkY2I0NWE0Yjg5YjAzY2U1OTY4MmM5YjA1YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWFzdCBUb3JvbnRvIENsdXN0ZXIgMTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODgxZjE0YTVkMjQ0NDEyMWFmNzRiMGYzZmMzYmZlZDMuc2V0Q29udGVudChodG1sX2U1YzNlZmRjYjQ1YTRiODliMDNjZTU5NjgyYzliMDVjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Q1N2RkZWY2M2EzYTQzMTRhM2I1YThkNDIyMWIzYzc4LmJpbmRQb3B1cChwb3B1cF84ODFmMTRhNWQyNDQ0MTIxYWY3NGIwZjNmYzNiZmVkMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80NGIzZWI4MGU4YWM0YjFkYWZjNWFhMDRjZTcxMmZiZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY0MDgxNTcsLTc5LjM4MTc1MjI5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzZiNDY0MmRhYzg4YjQzZDhhZDg3NzQ0ZTE1YzQ5MjQ5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Y2MzE2YzFiYWJlYzQxYTFiMjBkOTRkYjFkNWJmNGE2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJjZjc1YTU0ZGJjMDQzOWE5NjdmYzViNjI1NTEzNjY5ID0gJCgnPGRpdiBpZD0iaHRtbF8yY2Y3NWE1NGRiYzA0MzlhOTY3ZmM1YjYyNTUxMzY2OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SGFyYm91cmZyb250IEVhc3QsIFRvcm9udG8gSXNsYW5kcywgVW5pb24gU3RhdGlvbiBDbHVzdGVyIDA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y2MzE2YzFiYWJlYzQxYTFiMjBkOTRkYjFkNWJmNGE2LnNldENvbnRlbnQoaHRtbF8yY2Y3NWE1NGRiYzA0MzlhOTY3ZmM1YjYyNTUxMzY2OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80NGIzZWI4MGU4YWM0YjFkYWZjNWFhMDRjZTcxMmZiZC5iaW5kUG9wdXAocG9wdXBfZjYzMTZjMWJhYmVjNDFhMWIyMGQ5NGRiMWQ1YmY0YTYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYmJjZDcyOTdiOTJkNDIyYzg1NDg1MWExYzM3YmE2NTMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NDc5MjY3MDAwMDAwMDYsLTc5LjQxOTc0OTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNmI0NjQyZGFjODhiNDNkOGFkODc3NDRlMTVjNDkyNDkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOGU4ZDNjMTNiNjQ5NGFkZjhkY2Y3NzBhODk5ZWZiYTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWU4ZWZkOTdlZTgyNGQ5MDliMzg0OGM2YTQ5MGQ4MjcgPSAkKCc8ZGl2IGlkPSJodG1sXzFlOGVmZDk3ZWU4MjRkOTA5YjM4NDhjNmE0OTBkODI3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MaXR0bGUgUG9ydHVnYWwsIFRyaW5pdHkgQ2x1c3RlciAwPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84ZThkM2MxM2I2NDk0YWRmOGRjZjc3MGE4OTllZmJhNi5zZXRDb250ZW50KGh0bWxfMWU4ZWZkOTdlZTgyNGQ5MDliMzg0OGM2YTQ5MGQ4MjcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYmJjZDcyOTdiOTJkNDIyYzg1NDg1MWExYzM3YmE2NTMuYmluZFBvcHVwKHBvcHVwXzhlOGQzYzEzYjY0OTRhZGY4ZGNmNzcwYTg5OWVmYmE2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ0YjI1MTExOWM5NTQ3OWQ5NWIxMGQ0N2E5YzAxNDg4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzI3OTI5MiwtNzkuMjYyMDI5NDAwMDAwMDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNmI0NjQyZGFjODhiNDNkOGFkODc3NDRlMTVjNDkyNDkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzM4NzQ3ZTEyMGEyNDk0YThiODE4YTRmYWM1YTMyYzYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjI4NGZlZDJiM2Q0NDFmYWExY2RhYzQyY2ZhMGYxYmQgPSAkKCc8ZGl2IGlkPSJodG1sX2IyODRmZWQyYjNkNDQxZmFhMWNkYWM0MmNmYTBmMWJkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FYXN0IEJpcmNobW91bnQgUGFyaywgSW9udmlldywgS2VubmVkeSBQYXJrIENsdXN0ZXIgMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzM4NzQ3ZTEyMGEyNDk0YThiODE4YTRmYWM1YTMyYzYuc2V0Q29udGVudChodG1sX2IyODRmZWQyYjNkNDQxZmFhMWNkYWM0MmNmYTBmMWJkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQ0YjI1MTExOWM5NTQ3OWQ5NWIxMGQ0N2E5YzAxNDg4LmJpbmRQb3B1cChwb3B1cF83Mzg3NDdlMTIwYTI0OTRhOGI4MThhNGZhYzVhMzJjNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82MjBmNTdiZGVmNmE0MDNmODM0N2NhYWM3Y2ZjODAzNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc4Njk0NzMsLTc5LjM4NTk3NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82YjQ2NDJkYWM4OGI0M2Q4YWQ4Nzc0NGUxNWM0OTI0OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iMGZkYWJlMTEzMzQ0ZjQzYjYyNTY4YmIzMGFjZDU0ZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hYTcxNzM2OTA5YjM0NGVkOGI3YmQ0YWFmNWFiMmIyYyA9ICQoJzxkaXYgaWQ9Imh0bWxfYWE3MTczNjkwOWIzNDRlZDhiN2JkNGFhZjVhYjJiMmMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJheXZpZXcgVmlsbGFnZSBDbHVzdGVyIDA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2IwZmRhYmUxMTMzNDRmNDNiNjI1NjhiYjMwYWNkNTRlLnNldENvbnRlbnQoaHRtbF9hYTcxNzM2OTA5YjM0NGVkOGI3YmQ0YWFmNWFiMmIyYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82MjBmNTdiZGVmNmE0MDNmODM0N2NhYWM3Y2ZjODAzNC5iaW5kUG9wdXAocG9wdXBfYjBmZGFiZTExMzM0NGY0M2I2MjU2OGJiMzBhY2Q1NGUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDliYmJmODI1NWY2NDgwMGE4M2E3YTc2YmFlYTliYmMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43Mzc0NzMyMDAwMDAwMDQsLTc5LjQ2NDc2MzI5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZmIzNjAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmZiMzYwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzZiNDY0MmRhYzg4YjQzZDhhZDg3NzQ0ZTE1YzQ5MjQ5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzExODMxMDk3ODk0NDQ3NjhiZTc1ZDg5YzZmMzExN2RiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NiZWJiZGE0N2NhOTRhMWI5ZDYzMGJhYTkyNDc4NzA1ID0gJCgnPGRpdiBpZD0iaHRtbF9jYmViYmRhNDdjYTk0YTFiOWQ2MzBiYWE5MjQ3ODcwNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q0ZCIFRvcm9udG8sIERvd25zdmlldyBFYXN0IENsdXN0ZXIgNDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTE4MzEwOTc4OTQ0NDc2OGJlNzVkODljNmYzMTE3ZGIuc2V0Q29udGVudChodG1sX2NiZWJiZGE0N2NhOTRhMWI5ZDYzMGJhYTkyNDc4NzA1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQ5YmJiZjgyNTVmNjQ4MDBhODNhN2E3NmJhZWE5YmJjLmJpbmRQb3B1cChwb3B1cF8xMTgzMTA5Nzg5NDQ0NzY4YmU3NWQ4OWM2ZjMxMTdkYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yYTkzMTJlNmI5MTg0YWI1ODlkZDBhM2YwMjY1NjRlMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY3OTU1NzEsLTc5LjM1MjE4OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82YjQ2NDJkYWM4OGI0M2Q4YWQ4Nzc0NGUxNWM0OTI0OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84ZDNmMjg2YmQ4YzQ0MTFkOGY3NjE2M2I0MzI5MjFiNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lMTU4YzljZTA4ZmY0ZTEyODg2MTc1OWFjYzdkMmY1NiA9ICQoJzxkaXYgaWQ9Imh0bWxfZTE1OGM5Y2UwOGZmNGUxMjg4NjE3NTlhY2M3ZDJmNTYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlRoZSBEYW5mb3J0aCBXZXN0LCBSaXZlcmRhbGUgQ2x1c3RlciAwPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84ZDNmMjg2YmQ4YzQ0MTFkOGY3NjE2M2I0MzI5MjFiNS5zZXRDb250ZW50KGh0bWxfZTE1OGM5Y2UwOGZmNGUxMjg4NjE3NTlhY2M3ZDJmNTYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMmE5MzEyZTZiOTE4NGFiNTg5ZGQwYTNmMDI2NTY0ZTAuYmluZFBvcHVwKHBvcHVwXzhkM2YyODZiZDhjNDQxMWQ4Zjc2MTYzYjQzMjkyMWI1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzgwZjIzYjVkZTM2MjRiNTY4MmEyZWZhODc0ZjEwOTUxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjQ3MTc2OCwtNzkuMzgxNTc2NDAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNmI0NjQyZGFjODhiNDNkOGFkODc3NDRlMTVjNDkyNDkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjdiNzY3MGYzNjVlNDVlNTlhOGVkY2E2ZGU3MTc2MmYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDE0MjNjMzYwZmY4NDNmNmJhOWExNGE3Njg1MTI3NDkgPSAkKCc8ZGl2IGlkPSJodG1sX2QxNDIzYzM2MGZmODQzZjZiYTlhMTRhNzY4NTEyNzQ5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5EZXNpZ24gRXhjaGFuZ2UsIFRvcm9udG8gRG9taW5pb24gQ2VudHJlIENsdXN0ZXIgMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjdiNzY3MGYzNjVlNDVlNTlhOGVkY2E2ZGU3MTc2MmYuc2V0Q29udGVudChodG1sX2QxNDIzYzM2MGZmODQzZjZiYTlhMTRhNzY4NTEyNzQ5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzgwZjIzYjVkZTM2MjRiNTY4MmEyZWZhODc0ZjEwOTUxLmJpbmRQb3B1cChwb3B1cF8yN2I3NjcwZjM2NWU0NWU1OWE4ZWRjYTZkZTcxNzYyZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82MTkyYzZhMzczYjc0MGZhOGFlZTBjMzI1Yzc2ODA0OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjYzNjg0NzIsLTc5LjQyODE5MTQwMDAwMDAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzZiNDY0MmRhYzg4YjQzZDhhZDg3NzQ0ZTE1YzQ5MjQ5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2EwODcyNjFlYTBhZjQ1NjJiMTg0NDYyMzQyNDAzNGJiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2QwM2NmYmUyZTViNzQxNGJhNzA3MWI0Y2UwNjIyOTY3ID0gJCgnPGRpdiBpZD0iaHRtbF9kMDNjZmJlMmU1Yjc0MTRiYTcwNzFiNGNlMDYyMjk2NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QnJvY2t0b24sIEV4aGliaXRpb24gUGxhY2UsIFBhcmtkYWxlIFZpbGxhZ2UgQ2x1c3RlciAwPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hMDg3MjYxZWEwYWY0NTYyYjE4NDQ2MjM0MjQwMzRiYi5zZXRDb250ZW50KGh0bWxfZDAzY2ZiZTJlNWI3NDE0YmE3MDcxYjRjZTA2MjI5NjcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjE5MmM2YTM3M2I3NDBmYThhZWUwYzMyNWM3NjgwNDkuYmluZFBvcHVwKHBvcHVwX2EwODcyNjFlYTBhZjQ1NjJiMTg0NDYyMzQyNDAzNGJiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2I1YWEwMWRiMWNjYTQ4MTc4OGM3Y2IxNzJmYjZmNmQyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzExMTExNzAwMDAwMDA0LC03OS4yODQ1NzcyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzZiNDY0MmRhYzg4YjQzZDhhZDg3NzQ0ZTE1YzQ5MjQ5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NkYzUxZjBiMmFkNDQ3NmNhNGY3MjFiZGU0ZTU3MTEyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU3OGI3ZGY3MDYzYjQzM2Y4NWJlYzE1YjRjNDg5NGIyID0gJCgnPGRpdiBpZD0iaHRtbF81NzhiN2RmNzA2M2I0MzNmODViZWMxNWI0YzQ4OTRiMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2xhaXJsZWEsIEdvbGRlbiBNaWxlLCBPYWtyaWRnZSBDbHVzdGVyIDA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2NkYzUxZjBiMmFkNDQ3NmNhNGY3MjFiZGU0ZTU3MTEyLnNldENvbnRlbnQoaHRtbF81NzhiN2RmNzA2M2I0MzNmODViZWMxNWI0YzQ4OTRiMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iNWFhMDFkYjFjY2E0ODE3ODhjN2NiMTcyZmI2ZjZkMi5iaW5kUG9wdXAocG9wdXBfY2RjNTFmMGIyYWQ0NDc2Y2E0ZjcyMWJkZTRlNTcxMTIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZmYwYWMzMzNlNTkxNGEwMzhlNmU3MzE0NWQyYzc3Y2EgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MzkwMTQ2LC03OS41MDY5NDM2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZmIzNjAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmZiMzYwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzZiNDY0MmRhYzg4YjQzZDhhZDg3NzQ0ZTE1YzQ5MjQ5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U1NTc4NzM3OTlmODQ1M2JhNDFlMmQwN2I5YTYyYmFjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzhkNDkxM2NhNjU1YjQ4ZWE5ZjhiNTcwZjYwY2YwNjJkID0gJCgnPGRpdiBpZD0iaHRtbF84ZDQ5MTNjYTY1NWI0OGVhOWY4YjU3MGY2MGNmMDYyZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RG93bnN2aWV3IFdlc3QgQ2x1c3RlciA0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lNTU3ODczNzk5Zjg0NTNiYTQxZTJkMDdiOWE2MmJhYy5zZXRDb250ZW50KGh0bWxfOGQ0OTEzY2E2NTViNDhlYTlmOGI1NzBmNjBjZjA2MmQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZmYwYWMzMzNlNTkxNGEwMzhlNmU3MzE0NWQyYzc3Y2EuYmluZFBvcHVwKHBvcHVwX2U1NTc4NzM3OTlmODQ1M2JhNDFlMmQwN2I5YTYyYmFjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzBjODg2N2Y0ZjI2MDQ0YmZhY2IyMzk2MmE4MTA1MjYxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjY4OTk4NSwtNzkuMzE1NTcxNTk5OTk5OThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNmI0NjQyZGFjODhiNDNkOGFkODc3NDRlMTVjNDkyNDkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTUyZjZkYjk5ZDY3NDc2NjljOWE1ZDM3MWI5NzMwYTEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzcwMTEwNWJhZGY3NDdhMjgzOWMyZGU2MDE2N2E2OTUgPSAkKCc8ZGl2IGlkPSJodG1sX2M3MDExMDViYWRmNzQ3YTI4MzljMmRlNjAxNjdhNjk1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5UaGUgQmVhY2hlcyBXZXN0LCBJbmRpYSBCYXphYXIgQ2x1c3RlciAwPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hNTJmNmRiOTlkNjc0NzY2OWM5YTVkMzcxYjk3MzBhMS5zZXRDb250ZW50KGh0bWxfYzcwMTEwNWJhZGY3NDdhMjgzOWMyZGU2MDE2N2E2OTUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMGM4ODY3ZjRmMjYwNDRiZmFjYjIzOTYyYTgxMDUyNjEuYmluZFBvcHVwKHBvcHVwX2E1MmY2ZGI5OWQ2NzQ3NjY5YzlhNWQzNzFiOTczMGExKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzM4ZjhjY2FjMzQwMDQ3NjE5M2VjMTI3ZTc4MzZkNDczID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjQ4MTk4NSwtNzkuMzc5ODE2OTAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNmI0NjQyZGFjODhiNDNkOGFkODc3NDRlMTVjNDkyNDkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTMwMzAyNzdmMDFjNDI0ZTk2Njg0ZmNkYzhiMTUwZWMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmRjZTA4ZDc1YWQ2NDRiOTlhMmMxMWExMTBlMTNiYzUgPSAkKCc8ZGl2IGlkPSJodG1sXzZkY2UwOGQ3NWFkNjQ0Yjk5YTJjMTFhMTEwZTEzYmM1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Db21tZXJjZSBDb3VydCwgVmljdG9yaWEgSG90ZWwgQ2x1c3RlciAwPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85MzAzMDI3N2YwMWM0MjRlOTY2ODRmY2RjOGIxNTBlYy5zZXRDb250ZW50KGh0bWxfNmRjZTA4ZDc1YWQ2NDRiOTlhMmMxMWExMTBlMTNiYzUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzhmOGNjYWMzNDAwNDc2MTkzZWMxMjdlNzgzNmQ0NzMuYmluZFBvcHVwKHBvcHVwXzkzMDMwMjc3ZjAxYzQyNGU5NjY4NGZjZGM4YjE1MGVjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ViZjI3NjU2MjVkNDQ3MmViZGJkMTUzZTkxMTc5NzhlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzEzNzU2MjAwMDAwMDA2LC03OS40OTAwNzM4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZmIzNjAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmZiMzYwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzZiNDY0MmRhYzg4YjQzZDhhZDg3NzQ0ZTE1YzQ5MjQ5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzAxNzc3ZGY2YWRkOTRjYmZhZTZjOTk2ZmQ5MDQzZmU0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Y4N2Q5OTU0NGNhMDRiOWI5ZTRiMTVkMTE5Nzk2ZmQ3ID0gJCgnPGRpdiBpZD0iaHRtbF9mODdkOTk1NDRjYTA0YjliOWU0YjE1ZDExOTc5NmZkNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RG93bnN2aWV3LCBOb3J0aCBQYXJrLCBVcHdvb2QgUGFyayBDbHVzdGVyIDQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzAxNzc3ZGY2YWRkOTRjYmZhZTZjOTk2ZmQ5MDQzZmU0LnNldENvbnRlbnQoaHRtbF9mODdkOTk1NDRjYTA0YjliOWU0YjE1ZDExOTc5NmZkNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lYmYyNzY1NjI1ZDQ0NzJlYmRiZDE1M2U5MTE3OTc4ZS5iaW5kUG9wdXAocG9wdXBfMDE3NzdkZjZhZGQ5NGNiZmFlNmM5OTZmZDkwNDNmZTQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZWY2NDEwYjVmYWUwNDAzYTkyMWVlNTJiZjhlZmQ5NTkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43NTYzMDMzLC03OS41NjU5NjMyOTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82YjQ2NDJkYWM4OGI0M2Q4YWQ4Nzc0NGUxNWM0OTI0OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jZDcwMzRmZmZhODA0NDBmYmE3NDEyYmJjZDE4Njg4MyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yMGFmMWUyZjBmY2Q0NTc4YjY1OTY0OTJmOWYwOTBjMCA9ICQoJzxkaXYgaWQ9Imh0bWxfMjBhZjFlMmYwZmNkNDU3OGI2NTk2NDkyZjlmMDkwYzAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkh1bWJlciBTdW1taXQgQ2x1c3RlciAwPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jZDcwMzRmZmZhODA0NDBmYmE3NDEyYmJjZDE4Njg4My5zZXRDb250ZW50KGh0bWxfMjBhZjFlMmYwZmNkNDU3OGI2NTk2NDkyZjlmMDkwYzApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZWY2NDEwYjVmYWUwNDAzYTkyMWVlNTJiZjhlZmQ5NTkuYmluZFBvcHVwKHBvcHVwX2NkNzAzNGZmZmE4MDQ0MGZiYTc0MTJiYmNkMTg2ODgzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2UwNDc5YjE4ZTBiNDQ4ZGE4YmZkZmYxNDJlMmUwYzdlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzE2MzE2LC03OS4yMzk0NzYwOTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82YjQ2NDJkYWM4OGI0M2Q4YWQ4Nzc0NGUxNWM0OTI0OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80ODdlNjAwNDUwNDY0MTVlYjU1ZDUwZGFiMTAzOWQ0NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82NmNhODE3MmNlYTA0YjAyYTgzYmE3MWNlNjI1NTA2OCA9ICQoJzxkaXYgaWQ9Imh0bWxfNjZjYTgxNzJjZWEwNGIwMmE4M2JhNzFjZTYyNTUwNjgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNsaWZmY3Jlc3QsIENsaWZmc2lkZSwgU2NhcmJvcm91Z2ggVmlsbGFnZSBXZXN0IENsdXN0ZXIgMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDg3ZTYwMDQ1MDQ2NDE1ZWI1NWQ1MGRhYjEwMzlkNDcuc2V0Q29udGVudChodG1sXzY2Y2E4MTcyY2VhMDRiMDJhODNiYTcxY2U2MjU1MDY4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2UwNDc5YjE4ZTBiNDQ4ZGE4YmZkZmYxNDJlMmUwYzdlLmJpbmRQb3B1cChwb3B1cF80ODdlNjAwNDUwNDY0MTVlYjU1ZDUwZGFiMTAzOWQ0Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zNjIyZWM5ZWYxODE0MDBiYTViZGNkMzcxOGRkN2FiZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcyODQ5NjQsLTc5LjQ5NTY5NzQwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzZiNDY0MmRhYzg4YjQzZDhhZDg3NzQ0ZTE1YzQ5MjQ5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzkxM2I4ZGEwNDZiNTQ2OWQ4ZWQ4NWZjYWI5MDkzNWJlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBiODcwYWI3YTA1ZjRmYzBiYjg2NjVmYjQyMWI2MjUwID0gJCgnPGRpdiBpZD0iaHRtbF8wYjg3MGFiN2EwNWY0ZmMwYmI4NjY1ZmI0MjFiNjI1MCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RG93bnN2aWV3IENlbnRyYWwgQ2x1c3RlciAwPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85MTNiOGRhMDQ2YjU0NjlkOGVkODVmY2FiOTA5MzViZS5zZXRDb250ZW50KGh0bWxfMGI4NzBhYjdhMDVmNGZjMGJiODY2NWZiNDIxYjYyNTApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzYyMmVjOWVmMTgxNDAwYmE1YmRjZDM3MThkZDdhYmYuYmluZFBvcHVwKHBvcHVwXzkxM2I4ZGEwNDZiNTQ2OWQ4ZWQ4NWZjYWI5MDkzNWJlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2U1NjRmNzhiMDI4YzQxN2FiZWU4NTg2OWMwNTZjY2QwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjU5NTI1NSwtNzkuMzQwOTIzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzZiNDY0MmRhYzg4YjQzZDhhZDg3NzQ0ZTE1YzQ5MjQ5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI2NjdmODUwNGI1NDQ3ZDg4NzQ2ZmQ0ZjZiMjc2MzAwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzZmNWM1ZTQ1MzExOTRiNmJiM2JlNjcyZTdmNGI3OTk4ID0gJCgnPGRpdiBpZD0iaHRtbF82ZjVjNWU0NTMxMTk0YjZiYjNiZTY3MmU3ZjRiNzk5OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3R1ZGlvIERpc3RyaWN0IENsdXN0ZXIgMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjY2N2Y4NTA0YjU0NDdkODg3NDZmZDRmNmIyNzYzMDAuc2V0Q29udGVudChodG1sXzZmNWM1ZTQ1MzExOTRiNmJiM2JlNjcyZTdmNGI3OTk4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2U1NjRmNzhiMDI4YzQxN2FiZWU4NTg2OWMwNTZjY2QwLmJpbmRQb3B1cChwb3B1cF8yNjY3Zjg1MDRiNTQ0N2Q4ODc0NmZkNGY2YjI3NjMwMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kNGRkOGIyODc5Yjk0ZGVkYmI5MTBjMDEyZTExMjNjZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjczMzI4MjUsLTc5LjQxOTc0OTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNmI0NjQyZGFjODhiNDNkOGFkODc3NDRlMTVjNDkyNDkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmYyZWNiZWI5YmI3NGM1MzgzNWFjYzljOTg1NGVlMmEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTMzNTk4ZTYzMWJmNDM3M2I4MGUzNjVkNzZmZTMwZWMgPSAkKCc8ZGl2IGlkPSJodG1sXzkzMzU5OGU2MzFiZjQzNzNiODBlMzY1ZDc2ZmUzMGVjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CZWRmb3JkIFBhcmssIExhd3JlbmNlIE1hbm9yIEVhc3QgQ2x1c3RlciAwPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mZjJlY2JlYjliYjc0YzUzODM1YWNjOWM5ODU0ZWUyYS5zZXRDb250ZW50KGh0bWxfOTMzNTk4ZTYzMWJmNDM3M2I4MGUzNjVkNzZmZTMwZWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDRkZDhiMjg3OWI5NGRlZGJiOTEwYzAxMmUxMTIzY2UuYmluZFBvcHVwKHBvcHVwX2ZmMmVjYmViOWJiNzRjNTM4MzVhY2M5Yzk4NTRlZTJhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JkNTg0NDE2ODFmMDRmODNiNGE4NDMxMzQxYTZiNjg2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjkxMTE1OCwtNzkuNDc2MDEzMjk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNmI0NjQyZGFjODhiNDNkOGFkODc3NDRlMTVjNDkyNDkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmZhMGNmMWNiMWQ0NDgyZDg0MGEzNjdmNTBmN2QzZjggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWVkNDgxZTg3MWNmNGNiNGExZTYxMzYzNThkYzk3NzUgPSAkKCc8ZGl2IGlkPSJodG1sXzVlZDQ4MWU4NzFjZjRjYjRhMWU2MTM2MzU4ZGM5Nzc1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5EZWwgUmF5LCBLZWVsZXNkYWxlLCBNb3VudCBEZW5uaXMsIFNpbHZlcnRob3JuIENsdXN0ZXIgMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMmZhMGNmMWNiMWQ0NDgyZDg0MGEzNjdmNTBmN2QzZjguc2V0Q29udGVudChodG1sXzVlZDQ4MWU4NzFjZjRjYjRhMWU2MTM2MzU4ZGM5Nzc1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2JkNTg0NDE2ODFmMDRmODNiNGE4NDMxMzQxYTZiNjg2LmJpbmRQb3B1cChwb3B1cF8yZmEwY2YxY2IxZDQ0ODJkODQwYTM2N2Y1MGY3ZDNmOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82NGQ4NmI1MTMwMDM0OWJiOGViZTllZDM1YmYyN2FmNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcyNDc2NTksLTc5LjUzMjI0MjQwMDAwMDAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzZiNDY0MmRhYzg4YjQzZDhhZDg3NzQ0ZTE1YzQ5MjQ5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzIwZjBlYzQzZmMxZDQ3NDY5MGM3Y2QxYmFlYzI1ZjMyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ZjMWRiNGM2N2ZlYzRhNWFhNjNmNzhiZjI0YWFlZTI2ID0gJCgnPGRpdiBpZD0iaHRtbF9mYzFkYjRjNjdmZWM0YTVhYTYzZjc4YmYyNGFhZWUyNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RW1lcnksIEh1bWJlcmxlYSBDbHVzdGVyIDA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzIwZjBlYzQzZmMxZDQ3NDY5MGM3Y2QxYmFlYzI1ZjMyLnNldENvbnRlbnQoaHRtbF9mYzFkYjRjNjdmZWM0YTVhYTYzZjc4YmYyNGFhZWUyNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82NGQ4NmI1MTMwMDM0OWJiOGViZTllZDM1YmYyN2FmNC5iaW5kUG9wdXAocG9wdXBfMjBmMGVjNDNmYzFkNDc0NjkwYzdjZDFiYWVjMjVmMzIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDA3MGY3ZjQwZTEzNDM3ZWI0Njk4OWYyNGYxY2ZmYzUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42OTI2NTcwMDAwMDAwMDQsLTc5LjI2NDg0ODFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNmI0NjQyZGFjODhiNDNkOGFkODc3NDRlMTVjNDkyNDkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjIwY2NlM2NhZjRkNGM0Zjg0NTMzZTQxYmExMDMxMzkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmM2Mjk1ZmJkN2I0NDRhMmE3NWExY2ExMzk3Mjc1NjEgPSAkKCc8ZGl2IGlkPSJodG1sXzJjNjI5NWZiZDdiNDQ0YTJhNzVhMWNhMTM5NzI3NTYxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CaXJjaCBDbGlmZiwgQ2xpZmZzaWRlIFdlc3QgQ2x1c3RlciAwPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82MjBjY2UzY2FmNGQ0YzRmODQ1MzNlNDFiYTEwMzEzOS5zZXRDb250ZW50KGh0bWxfMmM2Mjk1ZmJkN2I0NDRhMmE3NWExY2ExMzk3Mjc1NjEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDA3MGY3ZjQwZTEzNDM3ZWI0Njk4OWYyNGYxY2ZmYzUuYmluZFBvcHVwKHBvcHVwXzYyMGNjZTNjYWY0ZDRjNGY4NDUzM2U0MWJhMTAzMTM5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2I2MWY1NTZlMGJjYTRkN2VhNWZmZjMxMjRlNjgxOWMwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzcwMTE5OSwtNzkuNDA4NDkyNzk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNmI0NjQyZGFjODhiNDNkOGFkODc3NDRlMTVjNDkyNDkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGZjMDEzMTI3OGYyNDlmZDkzNDI1MGM4YzUyYjA2YTggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2ExZTUzOGJmNmY3NDFkMzk0ODk5YTg2ZGEyMDdiZWQgPSAkKCc8ZGl2IGlkPSJodG1sXzNhMWU1MzhiZjZmNzQxZDM5NDg5OWE4NmRhMjA3YmVkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XaWxsb3dkYWxlIFNvdXRoIENsdXN0ZXIgMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZGZjMDEzMTI3OGYyNDlmZDkzNDI1MGM4YzUyYjA2YTguc2V0Q29udGVudChodG1sXzNhMWU1MzhiZjZmNzQxZDM5NDg5OWE4NmRhMjA3YmVkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2I2MWY1NTZlMGJjYTRkN2VhNWZmZjMxMjRlNjgxOWMwLmJpbmRQb3B1cChwb3B1cF9kZmMwMTMxMjc4ZjI0OWZkOTM0MjUwYzhjNTJiMDZhOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iMjUxNzY4OTYxMDU0Y2ZlYWNlMDIyMzA0OTkyNzBjZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc2MTYzMTMsLTc5LjUyMDk5OTQwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzZiNDY0MmRhYzg4YjQzZDhhZDg3NzQ0ZTE1YzQ5MjQ5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ExMjMxMTkwNWRiYjQ0YjA4Y2E1NzVhMWE4NzhhZTYzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NmN2FhMTIwYmRhZTRjMzhhNmM5ODJiYzY2NDM0NzUzID0gJCgnPGRpdiBpZD0iaHRtbF9jZjdhYTEyMGJkYWU0YzM4YTZjOTgyYmM2NjQzNDc1MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RG93bnN2aWV3IE5vcnRod2VzdCBDbHVzdGVyIDA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ExMjMxMTkwNWRiYjQ0YjA4Y2E1NzVhMWE4NzhhZTYzLnNldENvbnRlbnQoaHRtbF9jZjdhYTEyMGJkYWU0YzM4YTZjOTgyYmM2NjQzNDc1Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iMjUxNzY4OTYxMDU0Y2ZlYWNlMDIyMzA0OTkyNzBjZC5iaW5kUG9wdXAocG9wdXBfYTEyMzExOTA1ZGJiNDRiMDhjYTU3NWExYTg3OGFlNjMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTlhNjQ2ZTY2NDRkNDQ2NTg3MDRhMDA4NDQ5Y2E2YjcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MjgwMjA1LC03OS4zODg3OTAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZmIzNjAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmZiMzYwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzZiNDY0MmRhYzg4YjQzZDhhZDg3NzQ0ZTE1YzQ5MjQ5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc2YmI0NjZiZmYxMjQ1NDZiNDBmY2FjYzI0MTIyYmIwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ4N2RmNDVlMWMyNjRiNTJiMGQ3YzM4MGEyYzJjMWQ0ID0gJCgnPGRpdiBpZD0iaHRtbF80ODdkZjQ1ZTFjMjY0YjUyYjBkN2MzODBhMmMyYzFkNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGF3cmVuY2UgUGFyayBDbHVzdGVyIDQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzc2YmI0NjZiZmYxMjQ1NDZiNDBmY2FjYzI0MTIyYmIwLnNldENvbnRlbnQoaHRtbF80ODdkZjQ1ZTFjMjY0YjUyYjBkN2MzODBhMmMyYzFkNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85OWE2NDZlNjY0NGQ0NDY1ODcwNGEwMDg0NDljYTZiNy5iaW5kUG9wdXAocG9wdXBfNzZiYjQ2NmJmZjEyNDU0NmI0MGZjYWNjMjQxMjJiYjApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTFjNDUxNGY0OGM0NGJmYTliMThkMGExMzFiMTAyMjIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MTE2OTQ4LC03OS40MTY5MzU1OTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82YjQ2NDJkYWM4OGI0M2Q4YWQ4Nzc0NGUxNWM0OTI0OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hZmZmMGY0Y2ZiMWU0YWNjYjZkYmI0MDIwYTI0NjI4OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85NTAwYWRiMjAyNWE0YzBjOWYzNzI1NjA2NGM0Zjc2MSA9ICQoJzxkaXYgaWQ9Imh0bWxfOTUwMGFkYjIwMjVhNGMwYzlmMzcyNTYwNjRjNGY3NjEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJvc2VsYXduIENsdXN0ZXIgMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYWZmZjBmNGNmYjFlNGFjY2I2ZGJiNDAyMGEyNDYyODguc2V0Q29udGVudChodG1sXzk1MDBhZGIyMDI1YTRjMGM5ZjM3MjU2MDY0YzRmNzYxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzExYzQ1MTRmNDhjNDRiZmE5YjE4ZDBhMTMxYjEwMjIyLmJpbmRQb3B1cChwb3B1cF9hZmZmMGY0Y2ZiMWU0YWNjYjZkYmI0MDIwYTI0NjI4OCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kYzNhOWY0OTljZTM0MGY1YmY0ODdhMGMyZjZhNjZiNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY3MzE4NTI5OTk5OTk5LC03OS40ODcyNjE5MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82YjQ2NDJkYWM4OGI0M2Q4YWQ4Nzc0NGUxNWM0OTI0OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iOTY2YzJkM2E2YjU0OTUyODJjMWM5YmFhNjgxNzA1NSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zMmU5YWMyM2U2ZmI0YzI3ODlmYzJjNDFiNjI1OGI4NiA9ICQoJzxkaXYgaWQ9Imh0bWxfMzJlOWFjMjNlNmZiNGMyNzg5ZmMyYzQxYjYyNThiODYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlRoZSBKdW5jdGlvbiBOb3J0aCwgUnVubnltZWRlIENsdXN0ZXIgMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjk2NmMyZDNhNmI1NDk1MjgyYzFjOWJhYTY4MTcwNTUuc2V0Q29udGVudChodG1sXzMyZTlhYzIzZTZmYjRjMjc4OWZjMmM0MWI2MjU4Yjg2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2RjM2E5ZjQ5OWNlMzQwZjViZjQ4N2EwYzJmNmE2NmI3LmJpbmRQb3B1cChwb3B1cF9iOTY2YzJkM2E2YjU0OTUyODJjMWM5YmFhNjgxNzA1NSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xNTIyNzM4MDczMzg0YTc5YjllMzQ1NDJlMjU1ZTAwNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcwNjg3NiwtNzkuNTE4MTg4NDAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzgwMDBmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiM4MDAwZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNmI0NjQyZGFjODhiNDNkOGFkODc3NDRlMTVjNDkyNDkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODE0ZmYwMjVhOGUyNDRlY2EwZjI2NDMxMTgxZWJjZjkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODY5NTU1MTYzZmIyNGI2YmJlYWM4ZDE4Y2RlMmMyMjkgPSAkKCc8ZGl2IGlkPSJodG1sXzg2OTU1NTE2M2ZiMjRiNmJiZWFjOGQxOGNkZTJjMjI5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XZXN0b24gQ2x1c3RlciAxPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84MTRmZjAyNWE4ZTI0NGVjYTBmMjY0MzExODFlYmNmOS5zZXRDb250ZW50KGh0bWxfODY5NTU1MTYzZmIyNGI2YmJlYWM4ZDE4Y2RlMmMyMjkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTUyMjczODA3MzM4NGE3OWI5ZTM0NTQyZTI1NWUwMDUuYmluZFBvcHVwKHBvcHVwXzgxNGZmMDI1YThlMjQ0ZWNhMGYyNjQzMTE4MWViY2Y5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2U5ODExZjZkYjYzNzQ0ZGRiYjU0MmMyYjMzMWY5OWJhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzU3NDA5NiwtNzkuMjczMzA0MDAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNmI0NjQyZGFjODhiNDNkOGFkODc3NDRlMTVjNDkyNDkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzlkNmM2MWFlMDExNDEzZTgxM2E1MWNjMjY2Yjc3NzUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDM3ZjcyMGUwNDQ4NGI4YWIzNzE5ODZlZDg2NDdiMzIgPSAkKCc8ZGl2IGlkPSJodG1sXzAzN2Y3MjBlMDQ0ODRiOGFiMzcxOTg2ZWQ4NjQ3YjMyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Eb3JzZXQgUGFyaywgU2NhcmJvcm91Z2ggVG93biBDZW50cmUsIFdleGZvcmQgSGVpZ2h0cyBDbHVzdGVyIDA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzc5ZDZjNjFhZTAxMTQxM2U4MTNhNTFjYzI2NmI3Nzc1LnNldENvbnRlbnQoaHRtbF8wMzdmNzIwZTA0NDg0YjhhYjM3MTk4NmVkODY0N2IzMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lOTgxMWY2ZGI2Mzc0NGRkYmI1NDJjMmIzMzFmOTliYS5iaW5kUG9wdXAocG9wdXBfNzlkNmM2MWFlMDExNDEzZTgxM2E1MWNjMjY2Yjc3NzUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjE0ZmNmMDQ1MGNiNDhjM2I3MDI4ZjU1Y2E5ZTg0MjEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43NTI3NTgyOTk5OTk5OTYsLTc5LjQwMDA0OTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzgwMDBmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiM4MDAwZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNmI0NjQyZGFjODhiNDNkOGFkODc3NDRlMTVjNDkyNDkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzdjMGJhOGE2NjFhNDJkZWE4YTFkMTM3N2UyYTRiY2IgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTdiODFhZDFjZjlmNDA5Mzk1MWUzMzI4YjBiYzkxOGQgPSAkKCc8ZGl2IGlkPSJodG1sXzE3YjgxYWQxY2Y5ZjQwOTM5NTFlMzMyOGIwYmM5MThkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Zb3JrIE1pbGxzIFdlc3QgQ2x1c3RlciAxPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jN2MwYmE4YTY2MWE0MmRlYThhMWQxMzc3ZTJhNGJjYi5zZXRDb250ZW50KGh0bWxfMTdiODFhZDFjZjlmNDA5Mzk1MWUzMzI4YjBiYzkxOGQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjE0ZmNmMDQ1MGNiNDhjM2I3MDI4ZjU1Y2E5ZTg0MjEuYmluZFBvcHVwKHBvcHVwX2M3YzBiYThhNjYxYTQyZGVhOGExZDEzNzdlMmE0YmNiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzJmNzRlYjAwYTQzMzRhNWE4ZmQ1NmMyMGViODEwNTNkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzEyNzUxMSwtNzkuMzkwMTk3NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82YjQ2NDJkYWM4OGI0M2Q4YWQ4Nzc0NGUxNWM0OTI0OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wNmZhYmE4MzNiMDU0YzE0YTk3M2VjOTdkNzBhNDk3YSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85ZjQwNWFlMDczOGM0YTdmYmMzZTlmNDgwNTI5MzBhMCA9ICQoJzxkaXYgaWQ9Imh0bWxfOWY0MDVhZTA3MzhjNGE3ZmJjM2U5ZjQ4MDUyOTMwYTAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRhdmlzdmlsbGUgTm9ydGggQ2x1c3RlciAwPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wNmZhYmE4MzNiMDU0YzE0YTk3M2VjOTdkNzBhNDk3YS5zZXRDb250ZW50KGh0bWxfOWY0MDVhZTA3MzhjNGE3ZmJjM2U5ZjQ4MDUyOTMwYTApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMmY3NGViMDBhNDMzNGE1YThmZDU2YzIwZWI4MTA1M2QuYmluZFBvcHVwKHBvcHVwXzA2ZmFiYTgzM2IwNTRjMTRhOTczZWM5N2Q3MGE0OTdhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2IwYmFiZjhiYTJhMjQ2MTFiYzUyZWQxZGUzNjdkYjk0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjk2OTQ3NiwtNzkuNDExMzA3MjAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmYjM2MCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZmIzNjAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNmI0NjQyZGFjODhiNDNkOGFkODc3NDRlMTVjNDkyNDkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDFjNDU1MWI0NTk4NDRhODk1YWQzMGFkNDBmODM1ZmIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDA2NDU0YjFiNmI5NDY0MDgxYzI2Y2NiMjY3Njg3NTggPSAkKCc8ZGl2IGlkPSJodG1sX2QwNjQ1NGIxYjZiOTQ2NDA4MWMyNmNjYjI2NzY4NzU4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Gb3Jlc3QgSGlsbCBOb3J0aCwgRm9yZXN0IEhpbGwgV2VzdCBDbHVzdGVyIDQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2QxYzQ1NTFiNDU5ODQ0YTg5NWFkMzBhZDQwZjgzNWZiLnNldENvbnRlbnQoaHRtbF9kMDY0NTRiMWI2Yjk0NjQwODFjMjZjY2IyNjc2ODc1OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iMGJhYmY4YmEyYTI0NjExYmM1MmVkMWRlMzY3ZGI5NC5iaW5kUG9wdXAocG9wdXBfZDFjNDU1MWI0NTk4NDRhODk1YWQzMGFkNDBmODM1ZmIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjBkYjdiYmM3NzZkNDU1ZGFjOWZkMGE0ZTExN2JlMjIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NjE2MDgzLC03OS40NjQ3NjMyOTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82YjQ2NDJkYWM4OGI0M2Q4YWQ4Nzc0NGUxNWM0OTI0OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84OTIwYzc0ZWM2MjM0NWNhOWNiZGMxNThmYzNiMTQ1MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83Zjk0ZmZhMjc3N2U0MDc1OWU3NjE1NTMxMzlmOTgxYiA9ICQoJzxkaXYgaWQ9Imh0bWxfN2Y5NGZmYTI3NzdlNDA3NTllNzYxNTUzMTM5Zjk4MWIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkhpZ2ggUGFyaywgVGhlIEp1bmN0aW9uIFNvdXRoIENsdXN0ZXIgMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODkyMGM3NGVjNjIzNDVjYTljYmRjMTU4ZmMzYjE0NTIuc2V0Q29udGVudChodG1sXzdmOTRmZmEyNzc3ZTQwNzU5ZTc2MTU1MzEzOWY5ODFiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2IwZGI3YmJjNzc2ZDQ1NWRhYzlmZDBhNGUxMTdiZTIyLmJpbmRQb3B1cChwb3B1cF84OTIwYzc0ZWM2MjM0NWNhOWNiZGMxNThmYzNiMTQ1Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zNTVkYjg0MGI0MTA0Njk3OGY5OWIwZDg5ZDU0MDU4ZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY5NjMxOSwtNzkuNTMyMjQyNDAwMDAwMDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNmI0NjQyZGFjODhiNDNkOGFkODc3NDRlMTVjNDkyNDkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTUwYTBlNmNiODJmNGFjN2I0YzdkNDQyYTllM2JkMzQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODBhMjBmZTk4Njc0NDY5MDliOTA2ZDgwOWI0MWQzYjUgPSAkKCc8ZGl2IGlkPSJodG1sXzgwYTIwZmU5ODY3NDQ2OTA5YjkwNmQ4MDliNDFkM2I1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XZXN0bW91bnQgQ2x1c3RlciAwPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hNTBhMGU2Y2I4MmY0YWM3YjRjN2Q0NDJhOWUzYmQzNC5zZXRDb250ZW50KGh0bWxfODBhMjBmZTk4Njc0NDY5MDliOTA2ZDgwOWI0MWQzYjUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzU1ZGI4NDBiNDEwNDY5NzhmOTliMGQ4OWQ1NDA1OGYuYmluZFBvcHVwKHBvcHVwX2E1MGEwZTZjYjgyZjRhYzdiNGM3ZDQ0MmE5ZTNiZDM0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhlZGJkNmQ3Mjc1YzQ1ZWQ4YmU3YWRiNWE2NGI5NzZkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzUwMDcxNTAwMDAwMDA0LC03OS4yOTU4NDkxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzZiNDY0MmRhYzg4YjQzZDhhZDg3NzQ0ZTE1YzQ5MjQ5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Y2NzczN2Q0OGU0ZDQyOGVhYTFkMDVhYTVmZWI1NGQ3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U0ZGJiZWM1NmYzZjRjYzQ4ZGViZjc5NzRmZDk2OWZiID0gJCgnPGRpdiBpZD0iaHRtbF9lNGRiYmVjNTZmM2Y0Y2M0OGRlYmY3OTc0ZmQ5NjlmYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFyeXZhbGUsIFdleGZvcmQgQ2x1c3RlciAwPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mNjc3MzdkNDhlNGQ0MjhlYWExZDA1YWE1ZmViNTRkNy5zZXRDb250ZW50KGh0bWxfZTRkYmJlYzU2ZjNmNGNjNDhkZWJmNzk3NGZkOTY5ZmIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOGVkYmQ2ZDcyNzVjNDVlZDhiZTdhZGI1YTY0Yjk3NmQuYmluZFBvcHVwKHBvcHVwX2Y2NzczN2Q0OGU0ZDQyOGVhYTFkMDVhYTVmZWI1NGQ3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2E0YWU3M2RmN2EwZTQwZGNhYjJjZTIwNmRkYzVhZWU4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzgyNzM2NCwtNzkuNDQyMjU5M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82YjQ2NDJkYWM4OGI0M2Q4YWQ4Nzc0NGUxNWM0OTI0OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hY2VhOTIwNGQwZWU0OWIzYmY0MjZhNzU4NjhkMjc2NCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yMzE5YThjOWQxZTY0NDk2YWY2NDc4NTBhMTJiNGU5NSA9ICQoJzxkaXYgaWQ9Imh0bWxfMjMxOWE4YzlkMWU2NDQ5NmFmNjQ3ODUwYTEyYjRlOTUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldpbGxvd2RhbGUgV2VzdCBDbHVzdGVyIDA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FjZWE5MjA0ZDBlZTQ5YjNiZjQyNmE3NTg2OGQyNzY0LnNldENvbnRlbnQoaHRtbF8yMzE5YThjOWQxZTY0NDk2YWY2NDc4NTBhMTJiNGU5NSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hNGFlNzNkZjdhMGU0MGRjYWIyY2UyMDZkZGM1YWVlOC5iaW5kUG9wdXAocG9wdXBfYWNlYTkyMDRkMGVlNDliM2JmNDI2YTc1ODY4ZDI3NjQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzgzYjM5MjBjMWE1NGZkNmJmMGIxOWQxYWM4MTdmODYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MTUzODM0LC03OS40MDU2Nzg0MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82YjQ2NDJkYWM4OGI0M2Q4YWQ4Nzc0NGUxNWM0OTI0OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hNjBlYWIxNjIxMzQ0ZDJlYjQxZjAwYjkzNzlmYjEwNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84OTFhNWQ4ZTRlMjA0YmQ5OTc2MGZmY2IxNDUzZjgwZiA9ICQoJzxkaXYgaWQ9Imh0bWxfODkxYTVkOGU0ZTIwNGJkOTk3NjBmZmNiMTQ1M2Y4MGYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5vcnRoIFRvcm9udG8gV2VzdCBDbHVzdGVyIDA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E2MGVhYjE2MjEzNDRkMmViNDFmMDBiOTM3OWZiMTA3LnNldENvbnRlbnQoaHRtbF84OTFhNWQ4ZTRlMjA0YmQ5OTc2MGZmY2IxNDUzZjgwZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83ODNiMzkyMGMxYTU0ZmQ2YmYwYjE5ZDFhYzgxN2Y4Ni5iaW5kUG9wdXAocG9wdXBfYTYwZWFiMTYyMTM0NGQyZWI0MWYwMGI5Mzc5ZmIxMDcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjFjOTcwZTY2NTA4NGQ4OWFmNGM4ZjMwNWVlYzAzNGEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NzI3MDk3LC03OS40MDU2Nzg0MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82YjQ2NDJkYWM4OGI0M2Q4YWQ4Nzc0NGUxNWM0OTI0OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wZDMwYzcyNDg3ZDE0NmRhYTgzYTZhNjM0Nzk4YzQxMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zZTZkODEwZmEwMTc0M2MxYjY0YzgxMmM3MzYxN2I2MCA9ICQoJzxkaXYgaWQ9Imh0bWxfM2U2ZDgxMGZhMDE3NDNjMWI2NGM4MTJjNzM2MTdiNjAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlRoZSBBbm5leCwgTm9ydGggTWlkdG93biwgWW9ya3ZpbGxlIENsdXN0ZXIgMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMGQzMGM3MjQ4N2QxNDZkYWE4M2E2YTYzNDc5OGM0MTIuc2V0Q29udGVudChodG1sXzNlNmQ4MTBmYTAxNzQzYzFiNjRjODEyYzczNjE3YjYwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzYxYzk3MGU2NjUwODRkODlhZjRjOGYzMDVlZWMwMzRhLmJpbmRQb3B1cChwb3B1cF8wZDMwYzcyNDg3ZDE0NmRhYTgzYTZhNjM0Nzk4YzQxMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mZWEyMGVhYjNkNmI0N2Q3YWVkODA2OWMzOGNhMzVjNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY0ODk1OTcsLTc5LjQ1NjMyNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82YjQ2NDJkYWM4OGI0M2Q4YWQ4Nzc0NGUxNWM0OTI0OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83NDhjMGI1NmI3MjE0Y2MxODNlNDFjYzUyODM5ZjJjYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82MzdiZDFlYWVmZGU0MmYxYTgwZjc2NGIzODI5MTE3MCA9ICQoJzxkaXYgaWQ9Imh0bWxfNjM3YmQxZWFlZmRlNDJmMWE4MGY3NjRiMzgyOTExNzAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBhcmtkYWxlLCBSb25jZXN2YWxsZXMgQ2x1c3RlciAwPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83NDhjMGI1NmI3MjE0Y2MxODNlNDFjYzUyODM5ZjJjYi5zZXRDb250ZW50KGh0bWxfNjM3YmQxZWFlZmRlNDJmMWE4MGY3NjRiMzgyOTExNzApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZmVhMjBlYWIzZDZiNDdkN2FlZDgwNjljMzhjYTM1YzYuYmluZFBvcHVwKHBvcHVwXzc0OGMwYjU2YjcyMTRjYzE4M2U0MWNjNTI4MzlmMmNiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzY2NjU1NGYyNmQzMDQ2Njk4YjFlMDk4NDM2Njk5Y2M2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjM2OTY1NiwtNzkuNjE1ODE4OTk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNmI0NjQyZGFjODhiNDNkOGFkODc3NDRlMTVjNDkyNDkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNWY3ZmY1NTQxMzE5NDg0MjgxYzNlMDJjMTI1MDBmY2QgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmViYjIxZTAyOTE2NGMxN2IyZGFhZTdmNGY5ZDUxOTIgPSAkKCc8ZGl2IGlkPSJodG1sXzJlYmIyMWUwMjkxNjRjMTdiMmRhYWU3ZjRmOWQ1MTkyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DYW5hZGEgUG9zdCBHYXRld2F5IFByb2Nlc3NpbmcgQ2VudHJlIENsdXN0ZXIgMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNWY3ZmY1NTQxMzE5NDg0MjgxYzNlMDJjMTI1MDBmY2Quc2V0Q29udGVudChodG1sXzJlYmIyMWUwMjkxNjRjMTdiMmRhYWU3ZjRmOWQ1MTkyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzY2NjU1NGYyNmQzMDQ2Njk4YjFlMDk4NDM2Njk5Y2M2LmJpbmRQb3B1cChwb3B1cF81ZjdmZjU1NDEzMTk0ODQyODFjM2UwMmMxMjUwMGZjZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mYmQxYWM5ZjU5ZmQ0NzkwYTM1OWU2NzI2MzVhNjAwNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY4ODkwNTQsLTc5LjU1NDcyNDQwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZmIzNjAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmZiMzYwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzZiNDY0MmRhYzg4YjQzZDhhZDg3NzQ0ZTE1YzQ5MjQ5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhjMzM4ZDZkNjNmMzRmMGU4ZjZiYTUwYTQ1NTUyNDUyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzdiNDFkYTAwNDdjNjQzODg4NTliZmExNDA5NzQ4MGUyID0gJCgnPGRpdiBpZD0iaHRtbF83YjQxZGEwMDQ3YzY0Mzg4ODU5YmZhMTQwOTc0ODBlMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+S2luZ3N2aWV3IFZpbGxhZ2UsIE1hcnRpbiBHcm92ZSBHYXJkZW5zLCBSaWNodmlldyBHYXJkZW5zLCBTdC4gUGhpbGxpcHMgQ2x1c3RlciA0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84YzMzOGQ2ZDYzZjM0ZjBlOGY2YmE1MGE0NTU1MjQ1Mi5zZXRDb250ZW50KGh0bWxfN2I0MWRhMDA0N2M2NDM4ODg1OWJmYTE0MDk3NDgwZTIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZmJkMWFjOWY1OWZkNDc5MGEzNTllNjcyNjM1YTYwMDQuYmluZFBvcHVwKHBvcHVwXzhjMzM4ZDZkNjNmMzRmMGU4ZjZiYTUwYTQ1NTUyNDUyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2FmZDE4NDE4ZjRiYjQ3YTQ5MmU4MmFhZjZiOGRlYTMyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzk0MjAwMywtNzkuMjYyMDI5NDAwMDAwMDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNmI0NjQyZGFjODhiNDNkOGFkODc3NDRlMTVjNDkyNDkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTQ1NjY0YmFlNzc4NGZiZjg0YWUyM2JkN2Y4Y2E3YzMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzIyY2JiMzViMzE0NDgzN2IyZTE1NzdiMDEzNGM3YTYgPSAkKCc8ZGl2IGlkPSJodG1sXzMyMmNiYjM1YjMxNDQ4MzdiMmUxNTc3YjAxMzRjN2E2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BZ2luY291cnQgQ2x1c3RlciAwPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hNDU2NjRiYWU3Nzg0ZmJmODRhZTIzYmQ3ZjhjYTdjMy5zZXRDb250ZW50KGh0bWxfMzIyY2JiMzViMzE0NDgzN2IyZTE1NzdiMDEzNGM3YTYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYWZkMTg0MThmNGJiNDdhNDkyZTgyYWFmNmI4ZGVhMzIuYmluZFBvcHVwKHBvcHVwX2E0NTY2NGJhZTc3ODRmYmY4NGFlMjNiZDdmOGNhN2MzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2VjZDFiZTAwNzQ3YzQzZGZiYmMxODk0ZjZlZGNkNTU0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzA0MzI0NCwtNzkuMzg4NzkwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82YjQ2NDJkYWM4OGI0M2Q4YWQ4Nzc0NGUxNWM0OTI0OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lMGU0YjNjYTg0NjM0MDllOTQ4OTQ0ZGM4MzM3ZmNlZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84ZDg1YTc1YjY4NjI0YTMxYjkwMTBjYzBjNjRkNjRjNyA9ICQoJzxkaXYgaWQ9Imh0bWxfOGQ4NWE3NWI2ODYyNGEzMWI5MDEwY2MwYzY0ZDY0YzciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRhdmlzdmlsbGUgQ2x1c3RlciAwPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lMGU0YjNjYTg0NjM0MDllOTQ4OTQ0ZGM4MzM3ZmNlZi5zZXRDb250ZW50KGh0bWxfOGQ4NWE3NWI2ODYyNGEzMWI5MDEwY2MwYzY0ZDY0YzcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZWNkMWJlMDA3NDdjNDNkZmJiYzE4OTRmNmVkY2Q1NTQuYmluZFBvcHVwKHBvcHVwX2UwZTRiM2NhODQ2MzQwOWU5NDg5NDRkYzgzMzdmY2VmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg3MzAyMzQxYjI4YTQyOTU5NzAxZTIxMjBkNTNmZjM2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjYyNjk1NiwtNzkuNDAwMDQ5M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82YjQ2NDJkYWM4OGI0M2Q4YWQ4Nzc0NGUxNWM0OTI0OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wNGM2YmJmNmQ4ODM0NTNhYWM4YWFlZDAyNjk3MTkyYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81MzUzZThhNTgxZmU0MTU5OGQzYjg5N2UwNDQ5N2I5NSA9ICQoJzxkaXYgaWQ9Imh0bWxfNTM1M2U4YTU4MWZlNDE1OThkM2I4OTdlMDQ0OTdiOTUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkhhcmJvcmQsIFVuaXZlcnNpdHkgb2YgVG9yb250byBDbHVzdGVyIDA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA0YzZiYmY2ZDg4MzQ1M2FhYzhhYWVkMDI2OTcxOTJjLnNldENvbnRlbnQoaHRtbF81MzUzZThhNTgxZmU0MTU5OGQzYjg5N2UwNDQ5N2I5NSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84NzMwMjM0MWIyOGE0Mjk1OTcwMWUyMTIwZDUzZmYzNi5iaW5kUG9wdXAocG9wdXBfMDRjNmJiZjZkODgzNDUzYWFjOGFhZWQwMjY5NzE5MmMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzcyNjY2NWU4YThkNDA4ZmE3MjRkOTgwOWQ1ZGNkYTYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NTE1NzA2LC03OS40ODQ0NDk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzZiNDY0MmRhYzg4YjQzZDhhZDg3NzQ0ZTE1YzQ5MjQ5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2VjYmNmYmYwOWE1ZjQxYjM5OGQzMTQzZDc4MGEzNzgxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I2NTQ3Y2Q2YTEyYzQxYzE4YjBmNGQ4YjdiNzE2ODE1ID0gJCgnPGRpdiBpZD0iaHRtbF9iNjU0N2NkNmExMmM0MWMxOGIwZjRkOGI3YjcxNjgxNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UnVubnltZWRlLCBTd2Fuc2VhIENsdXN0ZXIgMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWNiY2ZiZjA5YTVmNDFiMzk4ZDMxNDNkNzgwYTM3ODEuc2V0Q29udGVudChodG1sX2I2NTQ3Y2Q2YTEyYzQxYzE4YjBmNGQ4YjdiNzE2ODE1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzc3MjY2NjVlOGE4ZDQwOGZhNzI0ZDk4MDlkNWRjZGE2LmJpbmRQb3B1cChwb3B1cF9lY2JjZmJmMDlhNWY0MWIzOThkMzE0M2Q3ODBhMzc4MSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kNmIwZjJkMzk0MDY0OWRiYTA5ODI0MjBhZTMyMmQ0NiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc4MTYzNzUsLTc5LjMwNDMwMjFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNmI0NjQyZGFjODhiNDNkOGFkODc3NDRlMTVjNDkyNDkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZWE2MDViNmM0MDIwNDg5NWIxZTBiNTQ3N2Y5ZWQ1MzAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2RiOGFjMTYzNDViNDZlYjhhN2M0NTQwN2JiMjE0YWYgPSAkKCc8ZGl2IGlkPSJodG1sXzNkYjhhYzE2MzQ1YjQ2ZWI4YTdjNDU0MDdiYjIxNGFmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DbGFya3MgQ29ybmVycywgU3VsbGl2YW4sIFRhbSBPJiMzOTtTaGFudGVyIENsdXN0ZXIgMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWE2MDViNmM0MDIwNDg5NWIxZTBiNTQ3N2Y5ZWQ1MzAuc2V0Q29udGVudChodG1sXzNkYjhhYzE2MzQ1YjQ2ZWI4YTdjNDU0MDdiYjIxNGFmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Q2YjBmMmQzOTQwNjQ5ZGJhMDk4MjQyMGFlMzIyZDQ2LmJpbmRQb3B1cChwb3B1cF9lYTYwNWI2YzQwMjA0ODk1YjFlMGI1NDc3ZjllZDUzMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85YzFkYTg3Yjk5MDg0MzNiYjFhMDM4MGJmZGFhMmUyMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY4OTU3NDMsLTc5LjM4MzE1OTkwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMwMGI1ZWIiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMDBiNWViIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzZiNDY0MmRhYzg4YjQzZDhhZDg3NzQ0ZTE1YzQ5MjQ5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzkzODk1YWRhOTE3YTQxZWE4NzI1YzY0MWVkNzJmZjVmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI5YmQ5NjFhYTdlYjQzODc5ZTk5MjMxNWQ0MDhlYTcyID0gJCgnPGRpdiBpZD0iaHRtbF8yOWJkOTYxYWE3ZWI0Mzg3OWU5OTIzMTVkNDA4ZWE3MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TW9vcmUgUGFyaywgU3VtbWVyaGlsbCBFYXN0IENsdXN0ZXIgMjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTM4OTVhZGE5MTdhNDFlYTg3MjVjNjQxZWQ3MmZmNWYuc2V0Q29udGVudChodG1sXzI5YmQ5NjFhYTdlYjQzODc5ZTk5MjMxNWQ0MDhlYTcyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzljMWRhODdiOTkwODQzM2JiMWEwMzgwYmZkYWEyZTIyLmJpbmRQb3B1cChwb3B1cF85Mzg5NWFkYTkxN2E0MWVhODcyNWM2NDFlZDcyZmY1Zik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jOTk4YmYyNjk2N2Y0ZWRjYTFmYTRkOTUxNmYyY2I0MSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY1MzIwNTcsLTc5LjQwMDA0OTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNmI0NjQyZGFjODhiNDNkOGFkODc3NDRlMTVjNDkyNDkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjQ4Y2U5M2E3YjljNDdmMjgzMDhiZWI4OWUyODk0ZTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjE4MzVkYWMyYTcyNDI5MmFkNGY5MzE5ZWE5NjVhM2QgPSAkKCc8ZGl2IGlkPSJodG1sX2YxODM1ZGFjMmE3MjQyOTJhZDRmOTMxOWVhOTY1YTNkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaGluYXRvd24sIEdyYW5nZSBQYXJrLCBLZW5zaW5ndG9uIE1hcmtldCBDbHVzdGVyIDA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY0OGNlOTNhN2I5YzQ3ZjI4MzA4YmViODllMjg5NGU1LnNldENvbnRlbnQoaHRtbF9mMTgzNWRhYzJhNzI0MjkyYWQ0ZjkzMTllYTk2NWEzZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jOTk4YmYyNjk2N2Y0ZWRjYTFmYTRkOTUxNmYyY2I0MS5iaW5kUG9wdXAocG9wdXBfNjQ4Y2U5M2E3YjljNDdmMjgzMDhiZWI4OWUyODk0ZTUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDdiZDZkMDVhMTAwNDgwOGFjNmRlODVkZTk4Nzc1YjIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My44MTUyNTIyLC03OS4yODQ1NzcyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMwMGI1ZWIiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMDBiNWViIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzZiNDY0MmRhYzg4YjQzZDhhZDg3NzQ0ZTE1YzQ5MjQ5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2I1YzUzYzU5MjU2MTQ4YWVhZTk2MzkyZTQ2ZGEzMjkyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNiNjA4YzUyYTBjNTRlNThhMzliMDBlODI2OGVjNmM2ID0gJCgnPGRpdiBpZD0iaHRtbF8zYjYwOGM1MmEwYzU0ZTU4YTM5YjAwZTgyNjhlYzZjNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QWdpbmNvdXJ0IE5vcnRoLCBMJiMzOTtBbW9yZWF1eCBFYXN0LCBNaWxsaWtlbiwgU3RlZWxlcyBFYXN0IENsdXN0ZXIgMjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjVjNTNjNTkyNTYxNDhhZWFlOTYzOTJlNDZkYTMyOTIuc2V0Q29udGVudChodG1sXzNiNjA4YzUyYTBjNTRlNThhMzliMDBlODI2OGVjNmM2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQ3YmQ2ZDA1YTEwMDQ4MDhhYzZkZTg1ZGU5ODc3NWIyLmJpbmRQb3B1cChwb3B1cF9iNWM1M2M1OTI1NjE0OGFlYWU5NjM5MmU0NmRhMzI5Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jODczYjA3MGFlYmM0ODkyYjRlZjczMzExMWZkNjdlNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY4NjQxMjI5OTk5OTk5LC03OS40MDAwNDkzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzZiNDY0MmRhYzg4YjQzZDhhZDg3NzQ0ZTE1YzQ5MjQ5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FlNjViZjY3MTgwYTQ5YWU5NmE4OWNkNWVmYzM4MzRiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNmYzQxYjRlNjIzMDRhM2E5MTVkNWRlNjZlNTJkNjE4ID0gJCgnPGRpdiBpZD0iaHRtbF8zZmM0MWI0ZTYyMzA0YTNhOTE1ZDVkZTY2ZTUyZDYxOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RGVlciBQYXJrLCBGb3Jlc3QgSGlsbCBTRSwgUmF0aG5lbGx5LCBTb3V0aCBIaWxsLCBTdW1tZXJoaWxsIFdlc3QgQ2x1c3RlciAwPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hZTY1YmY2NzE4MGE0OWFlOTZhODljZDVlZmMzODM0Yi5zZXRDb250ZW50KGh0bWxfM2ZjNDFiNGU2MjMwNGEzYTkxNWQ1ZGU2NmU1MmQ2MTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzg3M2IwNzBhZWJjNDg5MmI0ZWY3MzMxMTFmZDY3ZTYuYmluZFBvcHVwKHBvcHVwX2FlNjViZjY3MTgwYTQ5YWU5NmE4OWNkNWVmYzM4MzRiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2IzNGIxMzkwMTRkNDQyOTFhNTgwOTZkYjNlZDI1MjgxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjI4OTQ2NywtNzkuMzk0NDE5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82YjQ2NDJkYWM4OGI0M2Q4YWQ4Nzc0NGUxNWM0OTI0OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lYWQzZjQ4MjNmMDY0MWUyOTE0NzQzYmE1MWNiY2Q0MyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wMzUxNGU0MmQxZWM0NGVmYTBlMzAwNzkxNGQ1MWMyZSA9ICQoJzxkaXYgaWQ9Imh0bWxfMDM1MTRlNDJkMWVjNDRlZmEwZTMwMDc5MTRkNTFjMmUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNOIFRvd2VyLCBCYXRodXJzdCBRdWF5LCBJc2xhbmQgYWlycG9ydCwgSGFyYm91cmZyb250IFdlc3QsIEtpbmcgYW5kIFNwYWRpbmEsIFJhaWx3YXkgTGFuZHMsIFNvdXRoIE5pYWdhcmEgQ2x1c3RlciAwPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lYWQzZjQ4MjNmMDY0MWUyOTE0NzQzYmE1MWNiY2Q0My5zZXRDb250ZW50KGh0bWxfMDM1MTRlNDJkMWVjNDRlZmEwZTMwMDc5MTRkNTFjMmUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjM0YjEzOTAxNGQ0NDI5MWE1ODA5NmRiM2VkMjUyODEuYmluZFBvcHVwKHBvcHVwX2VhZDNmNDgyM2YwNjQxZTI5MTQ3NDNiYTUxY2JjZDQzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2YxN2Q5ODZiY2M1ZDQ0NzJhMTQ2MjRhMmI5ZDg0ZjAwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjA1NjQ2NiwtNzkuNTAxMzIwNzAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNmI0NjQyZGFjODhiNDNkOGFkODc3NDRlMTVjNDkyNDkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjA0MzAwODY3ZmU0NGU0ZDk4NzY5NWZjMmE3ZjI5ZTkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTZmZmE0OGExZjZkNDFlZTk1NTk1NDA3N2FiNzdlNmIgPSAkKCc8ZGl2IGlkPSJodG1sXzE2ZmZhNDhhMWY2ZDQxZWU5NTU5NTQwNzdhYjc3ZTZiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IdW1iZXIgQmF5IFNob3JlcywgTWltaWNvIFNvdXRoLCBOZXcgVG9yb250byBDbHVzdGVyIDA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2IwNDMwMDg2N2ZlNDRlNGQ5ODc2OTVmYzJhN2YyOWU5LnNldENvbnRlbnQoaHRtbF8xNmZmYTQ4YTFmNmQ0MWVlOTU1OTU0MDc3YWI3N2U2Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mMTdkOTg2YmNjNWQ0NDcyYTE0NjI0YTJiOWQ4NGYwMC5iaW5kUG9wdXAocG9wdXBfYjA0MzAwODY3ZmU0NGU0ZDk4NzY5NWZjMmE3ZjI5ZTkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjVmNGFhYzc1MTFmNDlhYmJiMGUyYjBhODdmYjk1MGYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43Mzk0MTYzOTk5OTk5OTYsLTc5LjU4ODQzNjldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNmI0NjQyZGFjODhiNDNkOGFkODc3NDRlMTVjNDkyNDkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDI0Y2MxYjhlM2YyNDRhYjkyNzhiZTQxMGQwMmVhYTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzhkMzUzYjQ4MmMzNDBhYWI4YmNjMzI3NjNhMzNlYmYgPSAkKCc8ZGl2IGlkPSJodG1sX2M4ZDM1M2I0ODJjMzQwYWFiOGJjYzMyNzYzYTMzZWJmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BbGJpb24gR2FyZGVucywgQmVhdW1vbmQgSGVpZ2h0cywgSHVtYmVyZ2F0ZSwgSmFtZXN0b3duLCBNb3VudCBPbGl2ZSwgU2lsdmVyc3RvbmUsIFNvdXRoIFN0ZWVsZXMsIFRoaXN0bGV0b3duIENsdXN0ZXIgMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDI0Y2MxYjhlM2YyNDRhYjkyNzhiZTQxMGQwMmVhYTUuc2V0Q29udGVudChodG1sX2M4ZDM1M2I0ODJjMzQwYWFiOGJjYzMyNzYzYTMzZWJmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Y1ZjRhYWM3NTExZjQ5YWJiYjBlMmIwYTg3ZmI5NTBmLmJpbmRQb3B1cChwb3B1cF80MjRjYzFiOGUzZjI0NGFiOTI3OGJlNDEwZDAyZWFhNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80NjczZTlhYmQ2MTQ0NWMzYTkwYTI0NDc2MTQ2ZjNlOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc5OTUyNTIwMDAwMDAwNSwtNzkuMzE4Mzg4N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82YjQ2NDJkYWM4OGI0M2Q4YWQ4Nzc0NGUxNWM0OTI0OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81YTRiNmU0OTI3OWM0YWVjYjk4ODEzNTgzNzljOWFkMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wMTRlNTM1MjcxZjk0MWViOWQyNTk3Y2Y5ZDJhNDIyYSA9ICQoJzxkaXYgaWQ9Imh0bWxfMDE0ZTUzNTI3MWY5NDFlYjlkMjU5N2NmOWQyYTQyMmEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkwmIzM5O0Ftb3JlYXV4IFdlc3QgQ2x1c3RlciAwPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81YTRiNmU0OTI3OWM0YWVjYjk4ODEzNTgzNzljOWFkMi5zZXRDb250ZW50KGh0bWxfMDE0ZTUzNTI3MWY5NDFlYjlkMjU5N2NmOWQyYTQyMmEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDY3M2U5YWJkNjE0NDVjM2E5MGEyNDQ3NjE0NmYzZTkuYmluZFBvcHVwKHBvcHVwXzVhNGI2ZTQ5Mjc5YzRhZWNiOTg4MTM1ODM3OWM5YWQyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2IzOGE3ZGJkYWNiMDQ4ZThhYWVmZjc0Zjg4OTgxZDI5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjc5NTYyNiwtNzkuMzc3NTI5NDAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzAwYjVlYiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMwMGI1ZWIiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNmI0NjQyZGFjODhiNDNkOGFkODc3NDRlMTVjNDkyNDkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDZmZTZmMDE0YmEzNDBhZTgwNTBiNDcwNDVjMzk0OTIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDg3MDZjOGM5ODQ4NDNiMWE3YTBiZDA3ZWVlMjU0ZWQgPSAkKCc8ZGl2IGlkPSJodG1sXzA4NzA2YzhjOTg0ODQzYjFhN2EwYmQwN2VlZTI1NGVkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Sb3NlZGFsZSBDbHVzdGVyIDI8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q2ZmU2ZjAxNGJhMzQwYWU4MDUwYjQ3MDQ1YzM5NDkyLnNldENvbnRlbnQoaHRtbF8wODcwNmM4Yzk4NDg0M2IxYTdhMGJkMDdlZWUyNTRlZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iMzhhN2RiZGFjYjA0OGU4YWFlZmY3NGY4ODk4MWQyOS5iaW5kUG9wdXAocG9wdXBfZDZmZTZmMDE0YmEzNDBhZTgwNTBiNDcwNDVjMzk0OTIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYmRhY2IyZDQzMjI2NDNhNGEyNjVhNTIxZDg1ZDQzZDQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NDY0MzUyLC03OS4zNzQ4NDU5OTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82YjQ2NDJkYWM4OGI0M2Q4YWQ4Nzc0NGUxNWM0OTI0OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80MmNjZmY2NDk1YWI0MzljYWY3MmE2ZGE3ZGNjMWQzNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mYjc0YTI2OGM4YmI0ZGY3OTU4ZTZmNWQ2MWU3NjlmOSA9ICQoJzxkaXYgaWQ9Imh0bWxfZmI3NGEyNjhjOGJiNGRmNzk1OGU2ZjVkNjFlNzY5ZjkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlN0biBBIFBPIEJveGVzIDI1IFRoZSBFc3BsYW5hZGUgQ2x1c3RlciAwPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80MmNjZmY2NDk1YWI0MzljYWY3MmE2ZGE3ZGNjMWQzNi5zZXRDb250ZW50KGh0bWxfZmI3NGEyNjhjOGJiNGRmNzk1OGU2ZjVkNjFlNzY5ZjkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYmRhY2IyZDQzMjI2NDNhNGEyNjVhNTIxZDg1ZDQzZDQuYmluZFBvcHVwKHBvcHVwXzQyY2NmZjY0OTVhYjQzOWNhZjcyYTZkYTdkY2MxZDM2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA1ZDdhNjBjNWU5YTQ4NTk5NjUzYjcxNDgzYTk0MWYzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjAyNDEzNzAwMDAwMDEsLTc5LjU0MzQ4NDA5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzZiNDY0MmRhYzg4YjQzZDhhZDg3NzQ0ZTE1YzQ5MjQ5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q2NTA2NTUzMmUwMjQ1ZThhYWM0OWEzNDJkMjYzYmI2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ1ZmZhMjU5YmE4NzRmMGFhZDBjN2IwNWM2N2MxMDY3ID0gJCgnPGRpdiBpZD0iaHRtbF80NWZmYTI1OWJhODc0ZjBhYWQwYzdiMDVjNjdjMTA2NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QWxkZXJ3b29kLCBMb25nIEJyYW5jaCBDbHVzdGVyIDA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q2NTA2NTUzMmUwMjQ1ZThhYWM0OWEzNDJkMjYzYmI2LnNldENvbnRlbnQoaHRtbF80NWZmYTI1OWJhODc0ZjBhYWQwYzdiMDVjNjdjMTA2Nyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wNWQ3YTYwYzVlOWE0ODU5OTY1M2I3MTQ4M2E5NDFmMy5iaW5kUG9wdXAocG9wdXBfZDY1MDY1NTMyZTAyNDVlOGFhYzQ5YTM0MmQyNjNiYjYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODI4YjNhODUxMjYzNGNjMWJiZTczZmEwZTUzMzEwODYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MDY3NDgyOTk5OTk5OTQsLTc5LjU5NDA1NDRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNmI0NjQyZGFjODhiNDNkOGFkODc3NDRlMTVjNDkyNDkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODIxNjYyYmM0OTE5NDVkZTllZGNjMWRkNzE3Mjg5NTMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDM0MWRmOTdjMmRmNDdjOTk4NzhiODA4ZjkyYzNlYjIgPSAkKCc8ZGl2IGlkPSJodG1sXzQzNDFkZjk3YzJkZjQ3Yzk5ODc4YjgwOGY5MmMzZWIyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ob3J0aHdlc3QgQ2x1c3RlciAwPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84MjE2NjJiYzQ5MTk0NWRlOWVkY2MxZGQ3MTcyODk1My5zZXRDb250ZW50KGh0bWxfNDM0MWRmOTdjMmRmNDdjOTk4NzhiODA4ZjkyYzNlYjIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODI4YjNhODUxMjYzNGNjMWJiZTczZmEwZTUzMzEwODYuYmluZFBvcHVwKHBvcHVwXzgyMTY2MmJjNDkxOTQ1ZGU5ZWRjYzFkZDcxNzI4OTUzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzFkMmIxMmRlMWJkYTQ2ZTVhZTNhNGM3MjgxZTA5N2JiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjY3OTY3LC03OS4zNjc2NzUzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzZiNDY0MmRhYzg4YjQzZDhhZDg3NzQ0ZTE1YzQ5MjQ5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzFiNWE0NDQ4ZTBlMzQ1ZmZhMjRlZjMwZGUzYzFjMWI4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzE1YzgwMWNlYzM4NDQ2NWFiMWMyYmJmM2Y1ZTM5MWNhID0gJCgnPGRpdiBpZD0iaHRtbF8xNWM4MDFjZWMzODQ0NjVhYjFjMmJiZjNmNWUzOTFjYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2FiYmFnZXRvd24sIFN0LiBKYW1lcyBUb3duIENsdXN0ZXIgMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMWI1YTQ0NDhlMGUzNDVmZmEyNGVmMzBkZTNjMWMxYjguc2V0Q29udGVudChodG1sXzE1YzgwMWNlYzM4NDQ2NWFiMWMyYmJmM2Y1ZTM5MWNhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzFkMmIxMmRlMWJkYTQ2ZTVhZTNhNGM3MjgxZTA5N2JiLmJpbmRQb3B1cChwb3B1cF8xYjVhNDQ0OGUwZTM0NWZmYTI0ZWYzMGRlM2MxYzFiOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wNTk2MzM2OGI3YTc0NGFkYmM4NjQyOTdkMzgzMGQxZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY0ODQyOTIsLTc5LjM4MjI4MDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNmI0NjQyZGFjODhiNDNkOGFkODc3NDRlMTVjNDkyNDkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDEzMWY5YTdiZTRjNGMzNjk3MGIxNWI3Njc1NjYyZTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzcxZWI5MmRhMzAyNGJiNjkzYzZjZjgzMTg5N2IyMGIgPSAkKCc8ZGl2IGlkPSJodG1sX2M3MWViOTJkYTMwMjRiYjY5M2M2Y2Y4MzE4OTdiMjBiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GaXJzdCBDYW5hZGlhbiBQbGFjZSwgVW5kZXJncm91bmQgY2l0eSBDbHVzdGVyIDA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2QxMzFmOWE3YmU0YzRjMzY5NzBiMTViNzY3NTY2MmU1LnNldENvbnRlbnQoaHRtbF9jNzFlYjkyZGEzMDI0YmI2OTNjNmNmODMxODk3YjIwYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wNTk2MzM2OGI3YTc0NGFkYmM4NjQyOTdkMzgzMGQxZi5iaW5kUG9wdXAocG9wdXBfZDEzMWY5YTdiZTRjNGMzNjk3MGIxNWI3Njc1NjYyZTUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNWIzMmUxNGFlNzUwNDRmMGFlODc0OTMwNDRjMGQ1NmYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NTM2NTM2MDAwMDAwMDUsLTc5LjUwNjk0MzZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmYjM2MCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZmIzNjAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNmI0NjQyZGFjODhiNDNkOGFkODc3NDRlMTVjNDkyNDkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWE1MzM2NTJmNGNmNGM2OGEwNTM5MmJjOTRjNzg1YTkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjBmYTcxZjJiMTZlNDYxNzg3YTJkZjY4MDk5ZGZmMWYgPSAkKCc8ZGl2IGlkPSJodG1sX2YwZmE3MWYyYjE2ZTQ2MTc4N2EyZGY2ODA5OWRmZjFmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5UaGUgS2luZ3N3YXksIE1vbnRnb21lcnkgUm9hZCwgT2xkIE1pbGwgTm9ydGggQ2x1c3RlciA0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xYTUzMzY1MmY0Y2Y0YzY4YTA1MzkyYmM5NGM3ODVhOS5zZXRDb250ZW50KGh0bWxfZjBmYTcxZjJiMTZlNDYxNzg3YTJkZjY4MDk5ZGZmMWYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNWIzMmUxNGFlNzUwNDRmMGFlODc0OTMwNDRjMGQ1NmYuYmluZFBvcHVwKHBvcHVwXzFhNTMzNjUyZjRjZjRjNjhhMDUzOTJiYzk0Yzc4NWE5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzgzZDMwZDA5ZmNjZTRiMzY5OWQ0OTZkODdlMDY2YzFhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjY1ODU5OSwtNzkuMzgzMTU5OTAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNmI0NjQyZGFjODhiNDNkOGFkODc3NDRlMTVjNDkyNDkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGMwYmFiMTNiOWZjNGMxN2E5M2YzYjQwMDBlOTc2YzAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWZmZWUxNDZkOGRmNDQ3NmE3YzFkMWFhNTRiNDMyMGUgPSAkKCc8ZGl2IGlkPSJodG1sXzFmZmVlMTQ2ZDhkZjQ0NzZhN2MxZDFhYTU0YjQzMjBlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaHVyY2ggYW5kIFdlbGxlc2xleSBDbHVzdGVyIDA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzRjMGJhYjEzYjlmYzRjMTdhOTNmM2I0MDAwZTk3NmMwLnNldENvbnRlbnQoaHRtbF8xZmZlZTE0NmQ4ZGY0NDc2YTdjMWQxYWE1NGI0MzIwZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84M2QzMGQwOWZjY2U0YjM2OTlkNDk2ZDg3ZTA2NmMxYS5iaW5kUG9wdXAocG9wdXBfNGMwYmFiMTNiOWZjNGMxN2E5M2YzYjQwMDBlOTc2YzApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfM2QzNmE3ZjUxMjA5NGRlZWIxMDBiODY2NDc0ZTEyOWYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NjI3NDM5LC03OS4zMjE1NThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNmI0NjQyZGFjODhiNDNkOGFkODc3NDRlMTVjNDkyNDkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2RiOWE4MDM4ZWFkNGI1OTg1OTNkMWExMDkxY2YyYTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjRiNzg3MDc4MGFjNDE4ZjhiNjhkYjcyMTI5NGFlMWUgPSAkKCc8ZGl2IGlkPSJodG1sXzI0Yjc4NzA3ODBhYzQxOGY4YjY4ZGI3MjEyOTRhZTFlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CdXNpbmVzcyBSZXBseSBNYWlsIFByb2Nlc3NpbmcgQ2VudHJlIDk2OSBFYXN0ZXJuIENsdXN0ZXIgMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2RiOWE4MDM4ZWFkNGI1OTg1OTNkMWExMDkxY2YyYTUuc2V0Q29udGVudChodG1sXzI0Yjc4NzA3ODBhYzQxOGY4YjY4ZGI3MjEyOTRhZTFlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzNkMzZhN2Y1MTIwOTRkZWViMTAwYjg2NjQ3NGUxMjlmLmJpbmRQb3B1cChwb3B1cF83ZGI5YTgwMzhlYWQ0YjU5ODU5M2QxYTEwOTFjZjJhNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yMjZiZjE3YzRhMTQ0YjgzOGYxMDViMzE1ODc1OWY5ZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjYzNjI1NzksLTc5LjQ5ODUwOTA5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzZiNDY0MmRhYzg4YjQzZDhhZDg3NzQ0ZTE1YzQ5MjQ5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzBiZjUwMjVkMDZlZTRkMTE5YjMyMmE5OWZlODc4Yjc1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM4ZDUxY2U2Y2YwMjQ0YTVhOGYxZWVlOWUyYWJkOGU4ID0gJCgnPGRpdiBpZD0iaHRtbF8zOGQ1MWNlNmNmMDI0NGE1YThmMWVlZTllMmFiZDhlOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SHVtYmVyIEJheSwgS2luZyYjMzk7cyBNaWxsIFBhcmssIEtpbmdzd2F5IFBhcmsgU291dGggRWFzdCwgTWltaWNvIE5FLCBPbGQgTWlsbCBTb3V0aCwgVGhlIFF1ZWVuc3dheSBFYXN0LCBSb3lhbCBZb3JrIFNvdXRoIEVhc3QsIFN1bm55bGVhIENsdXN0ZXIgMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMGJmNTAyNWQwNmVlNGQxMTliMzIyYTk5ZmU4NzhiNzUuc2V0Q29udGVudChodG1sXzM4ZDUxY2U2Y2YwMjQ0YTVhOGYxZWVlOWUyYWJkOGU4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzIyNmJmMTdjNGExNDRiODM4ZjEwNWIzMTU4NzU5ZjlmLmJpbmRQb3B1cChwb3B1cF8wYmY1MDI1ZDA2ZWU0ZDExOWIzMjJhOTlmZTg3OGI3NSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82MmM1Y2YxYmRlNDU0NWU2YmQzYmYzNDQ1MjJhYTRhYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjYyODg0MDgsLTc5LjUyMDk5OTQwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzZiNDY0MmRhYzg4YjQzZDhhZDg3NzQ0ZTE1YzQ5MjQ5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzAyNmUzMzE2NTI5NDQ5NTlhYTNhYmYwNDNlZjg2MWQ1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U4ZTk3MDBjYTUyYjRkZWM5MjFhNThiY2IxMzg1OWMxID0gJCgnPGRpdiBpZD0iaHRtbF9lOGU5NzAwY2E1MmI0ZGVjOTIxYTU4YmNiMTM4NTljMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+S2luZ3N3YXkgUGFyayBTb3V0aCBXZXN0LCBNaW1pY28gTlcsIFRoZSBRdWVlbnN3YXkgV2VzdCwgUm95YWwgWW9yayBTb3V0aCBXZXN0LCBTb3V0aCBvZiBCbG9vciBDbHVzdGVyIDA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzAyNmUzMzE2NTI5NDQ5NTlhYTNhYmYwNDNlZjg2MWQ1LnNldENvbnRlbnQoaHRtbF9lOGU5NzAwY2E1MmI0ZGVjOTIxYTU4YmNiMTM4NTljMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82MmM1Y2YxYmRlNDU0NWU2YmQzYmYzNDQ1MjJhYTRhYi5iaW5kUG9wdXAocG9wdXBfMDI2ZTMzMTY1Mjk0NDk1OWFhM2FiZjA0M2VmODYxZDUpOwoKICAgICAgICAgICAgCiAgICAgICAgCjwvc2NyaXB0Pg==\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>" | |
| ], | |
| "text/plain": [ | |
| "<folium.folium.Map at 0x7fe3047d6828>" | |
| ] | |
| }, | |
| "execution_count": 53, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "# create map\n", | |
| "map_clusters = folium.Map(location=[latitude_toronto, longitude_toronto], zoom_start=11)\n", | |
| "\n", | |
| "# set color scheme for the clusters\n", | |
| "x = np.arange(kclusters)\n", | |
| "ys = [i + x + (i*x)**2 for i in range(kclusters)]\n", | |
| "colors_array = cm.rainbow(np.linspace(0, 1, len(ys)))\n", | |
| "rainbow = [colors.rgb2hex(i) for i in colors_array]\n", | |
| "\n", | |
| "# add markers to the map\n", | |
| "markers_colors = []\n", | |
| "for lat, lon, poi, cluster in zip(toronto_merged['Latitude'], toronto_merged['Longitude'], toronto_merged['Neighbourhood'], toronto_merged['Cluster_Labels']):\n", | |
| " label = folium.Popup(str(poi) + ' Cluster ' + str(cluster), parse_html=True)\n", | |
| " folium.CircleMarker(\n", | |
| " [lat, lon],\n", | |
| " radius=5,\n", | |
| " popup=label,\n", | |
| " color=rainbow[cluster-1],\n", | |
| " fill=True,\n", | |
| " fill_color=rainbow[cluster-1],\n", | |
| " fill_opacity=0.7).add_to(map_clusters)\n", | |
| " \n", | |
| "map_clusters" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "### Examine Clusters" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 54, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<div>\n", | |
| "<style scoped>\n", | |
| " .dataframe tbody tr th:only-of-type {\n", | |
| " vertical-align: middle;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe tbody tr th {\n", | |
| " vertical-align: top;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe thead th {\n", | |
| " text-align: right;\n", | |
| " }\n", | |
| "</style>\n", | |
| "<table border=\"1\" class=\"dataframe\">\n", | |
| " <thead>\n", | |
| " <tr style=\"text-align: right;\">\n", | |
| " <th></th>\n", | |
| " <th>Borough</th>\n", | |
| " <th>Cluster_Labels</th>\n", | |
| " <th>1st Most Common Venue</th>\n", | |
| " <th>2nd Most Common Venue</th>\n", | |
| " <th>3rd Most Common Venue</th>\n", | |
| " <th>4th Most Common Venue</th>\n", | |
| " <th>5th Most Common Venue</th>\n", | |
| " <th>6th Most Common Venue</th>\n", | |
| " <th>7th Most Common Venue</th>\n", | |
| " <th>8th Most Common Venue</th>\n", | |
| " <th>9th Most Common Venue</th>\n", | |
| " <th>10th Most Common Venue</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>1</th>\n", | |
| " <td>North York</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Intersection</td>\n", | |
| " <td>Hockey Arena</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " <td>Portuguese Restaurant</td>\n", | |
| " <td>Pizza Place</td>\n", | |
| " <td>Event Space</td>\n", | |
| " <td>Ethiopian Restaurant</td>\n", | |
| " <td>Empanada Restaurant</td>\n", | |
| " <td>Falafel Restaurant</td>\n", | |
| " <td>Electronics Store</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>2</th>\n", | |
| " <td>Downtown Toronto</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " <td>Pub</td>\n", | |
| " <td>Bakery</td>\n", | |
| " <td>Park</td>\n", | |
| " <td>Mexican Restaurant</td>\n", | |
| " <td>Theater</td>\n", | |
| " <td>Breakfast Spot</td>\n", | |
| " <td>Café</td>\n", | |
| " <td>Gym / Fitness Center</td>\n", | |
| " <td>Health Food Store</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>3</th>\n", | |
| " <td>North York</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Clothing Store</td>\n", | |
| " <td>Furniture / Home Store</td>\n", | |
| " <td>Women's Store</td>\n", | |
| " <td>Boutique</td>\n", | |
| " <td>Gift Shop</td>\n", | |
| " <td>Event Space</td>\n", | |
| " <td>Miscellaneous Shop</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " <td>Accessories Store</td>\n", | |
| " <td>Vietnamese Restaurant</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>4</th>\n", | |
| " <td>Queen's Park</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " <td>Gym</td>\n", | |
| " <td>Japanese Restaurant</td>\n", | |
| " <td>Sushi Restaurant</td>\n", | |
| " <td>Park</td>\n", | |
| " <td>Persian Restaurant</td>\n", | |
| " <td>Smoothie Shop</td>\n", | |
| " <td>Seafood Restaurant</td>\n", | |
| " <td>Sandwich Place</td>\n", | |
| " <td>Burger Joint</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>7</th>\n", | |
| " <td>North York</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Basketball Court</td>\n", | |
| " <td>Baseball Field</td>\n", | |
| " <td>Caribbean Restaurant</td>\n", | |
| " <td>Café</td>\n", | |
| " <td>Japanese Restaurant</td>\n", | |
| " <td>Gym / Fitness Center</td>\n", | |
| " <td>Event Space</td>\n", | |
| " <td>Ethiopian Restaurant</td>\n", | |
| " <td>Empanada Restaurant</td>\n", | |
| " <td>Electronics Store</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>8</th>\n", | |
| " <td>East York</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Fast Food Restaurant</td>\n", | |
| " <td>Pizza Place</td>\n", | |
| " <td>Gastropub</td>\n", | |
| " <td>Breakfast Spot</td>\n", | |
| " <td>Café</td>\n", | |
| " <td>Bank</td>\n", | |
| " <td>Rock Climbing Spot</td>\n", | |
| " <td>Athletics & Sports</td>\n", | |
| " <td>Pharmacy</td>\n", | |
| " <td>Intersection</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>9</th>\n", | |
| " <td>Downtown Toronto</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " <td>Clothing Store</td>\n", | |
| " <td>Café</td>\n", | |
| " <td>Cosmetics Shop</td>\n", | |
| " <td>Middle Eastern Restaurant</td>\n", | |
| " <td>Ramen Restaurant</td>\n", | |
| " <td>Pizza Place</td>\n", | |
| " <td>Italian Restaurant</td>\n", | |
| " <td>Japanese Restaurant</td>\n", | |
| " <td>Tea Room</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>11</th>\n", | |
| " <td>Etobicoke</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Bank</td>\n", | |
| " <td>Yoga Studio</td>\n", | |
| " <td>Eastern European Restaurant</td>\n", | |
| " <td>Dog Run</td>\n", | |
| " <td>Doner Restaurant</td>\n", | |
| " <td>Donut Shop</td>\n", | |
| " <td>Drugstore</td>\n", | |
| " <td>Dumpling Restaurant</td>\n", | |
| " <td>Electronics Store</td>\n", | |
| " <td>Diner</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>12</th>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>0</td>\n", | |
| " <td>History Museum</td>\n", | |
| " <td>Bar</td>\n", | |
| " <td>Eastern European Restaurant</td>\n", | |
| " <td>Dog Run</td>\n", | |
| " <td>Doner Restaurant</td>\n", | |
| " <td>Donut Shop</td>\n", | |
| " <td>Drugstore</td>\n", | |
| " <td>Dumpling Restaurant</td>\n", | |
| " <td>Electronics Store</td>\n", | |
| " <td>Diner</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>13</th>\n", | |
| " <td>North York</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Gym</td>\n", | |
| " <td>Asian Restaurant</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " <td>Beer Store</td>\n", | |
| " <td>Italian Restaurant</td>\n", | |
| " <td>General Entertainment</td>\n", | |
| " <td>Dim Sum Restaurant</td>\n", | |
| " <td>Discount Store</td>\n", | |
| " <td>Japanese Restaurant</td>\n", | |
| " <td>Chinese Restaurant</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>14</th>\n", | |
| " <td>East York</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Skating Rink</td>\n", | |
| " <td>Pharmacy</td>\n", | |
| " <td>Athletics & Sports</td>\n", | |
| " <td>Cosmetics Shop</td>\n", | |
| " <td>Curling Ice</td>\n", | |
| " <td>Beer Store</td>\n", | |
| " <td>Park</td>\n", | |
| " <td>Video Store</td>\n", | |
| " <td>Greek Restaurant</td>\n", | |
| " <td>Donut Shop</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>15</th>\n", | |
| " <td>Downtown Toronto</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " <td>Café</td>\n", | |
| " <td>Restaurant</td>\n", | |
| " <td>Hotel</td>\n", | |
| " <td>Cosmetics Shop</td>\n", | |
| " <td>Bakery</td>\n", | |
| " <td>Breakfast Spot</td>\n", | |
| " <td>Clothing Store</td>\n", | |
| " <td>Gastropub</td>\n", | |
| " <td>Seafood Restaurant</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>16</th>\n", | |
| " <td>York</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Field</td>\n", | |
| " <td>Dog Run</td>\n", | |
| " <td>Hockey Arena</td>\n", | |
| " <td>Trail</td>\n", | |
| " <td>Eastern European Restaurant</td>\n", | |
| " <td>Discount Store</td>\n", | |
| " <td>Doner Restaurant</td>\n", | |
| " <td>Donut Shop</td>\n", | |
| " <td>Drugstore</td>\n", | |
| " <td>Dumpling Restaurant</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>17</th>\n", | |
| " <td>Etobicoke</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Pharmacy</td>\n", | |
| " <td>Liquor Store</td>\n", | |
| " <td>Pizza Place</td>\n", | |
| " <td>Convenience Store</td>\n", | |
| " <td>Café</td>\n", | |
| " <td>Shopping Plaza</td>\n", | |
| " <td>Beer Store</td>\n", | |
| " <td>Park</td>\n", | |
| " <td>Gluten-free Restaurant</td>\n", | |
| " <td>Gift Shop</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>18</th>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Intersection</td>\n", | |
| " <td>Spa</td>\n", | |
| " <td>Pizza Place</td>\n", | |
| " <td>Breakfast Spot</td>\n", | |
| " <td>Electronics Store</td>\n", | |
| " <td>Medical Center</td>\n", | |
| " <td>Rental Car Location</td>\n", | |
| " <td>Mexican Restaurant</td>\n", | |
| " <td>Donut Shop</td>\n", | |
| " <td>Diner</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>19</th>\n", | |
| " <td>East Toronto</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Health Food Store</td>\n", | |
| " <td>Pub</td>\n", | |
| " <td>Astrologer</td>\n", | |
| " <td>Grocery Store</td>\n", | |
| " <td>Neighborhood</td>\n", | |
| " <td>Diner</td>\n", | |
| " <td>Discount Store</td>\n", | |
| " <td>Dog Run</td>\n", | |
| " <td>Doner Restaurant</td>\n", | |
| " <td>Donut Shop</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>20</th>\n", | |
| " <td>Downtown Toronto</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " <td>Cocktail Bar</td>\n", | |
| " <td>Restaurant</td>\n", | |
| " <td>Cheese Shop</td>\n", | |
| " <td>Steakhouse</td>\n", | |
| " <td>Italian Restaurant</td>\n", | |
| " <td>Beer Bar</td>\n", | |
| " <td>Bakery</td>\n", | |
| " <td>Farmers Market</td>\n", | |
| " <td>Seafood Restaurant</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>22</th>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " <td>Pharmacy</td>\n", | |
| " <td>Korean Restaurant</td>\n", | |
| " <td>Discount Store</td>\n", | |
| " <td>Dog Run</td>\n", | |
| " <td>Doner Restaurant</td>\n", | |
| " <td>Donut Shop</td>\n", | |
| " <td>Drugstore</td>\n", | |
| " <td>Dumpling Restaurant</td>\n", | |
| " <td>Eastern European Restaurant</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>23</th>\n", | |
| " <td>East York</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " <td>Sporting Goods Shop</td>\n", | |
| " <td>Grocery Store</td>\n", | |
| " <td>Burger Joint</td>\n", | |
| " <td>Furniture / Home Store</td>\n", | |
| " <td>Breakfast Spot</td>\n", | |
| " <td>Supermarket</td>\n", | |
| " <td>Sports Bar</td>\n", | |
| " <td>Fish & Chips Shop</td>\n", | |
| " <td>Beer Store</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>24</th>\n", | |
| " <td>Downtown Toronto</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " <td>Café</td>\n", | |
| " <td>Italian Restaurant</td>\n", | |
| " <td>Middle Eastern Restaurant</td>\n", | |
| " <td>Sandwich Place</td>\n", | |
| " <td>Burger Joint</td>\n", | |
| " <td>Ice Cream Shop</td>\n", | |
| " <td>Indian Restaurant</td>\n", | |
| " <td>Bar</td>\n", | |
| " <td>Japanese Restaurant</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>25</th>\n", | |
| " <td>Downtown Toronto</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Café</td>\n", | |
| " <td>Grocery Store</td>\n", | |
| " <td>Park</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " <td>Diner</td>\n", | |
| " <td>Italian Restaurant</td>\n", | |
| " <td>Baby Store</td>\n", | |
| " <td>Athletics & Sports</td>\n", | |
| " <td>Nightclub</td>\n", | |
| " <td>Restaurant</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>26</th>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Athletics & Sports</td>\n", | |
| " <td>Hakka Restaurant</td>\n", | |
| " <td>Caribbean Restaurant</td>\n", | |
| " <td>Bakery</td>\n", | |
| " <td>Thai Restaurant</td>\n", | |
| " <td>Bank</td>\n", | |
| " <td>Fried Chicken Joint</td>\n", | |
| " <td>Drugstore</td>\n", | |
| " <td>Dog Run</td>\n", | |
| " <td>Doner Restaurant</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>27</th>\n", | |
| " <td>North York</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Golf Course</td>\n", | |
| " <td>Dog Run</td>\n", | |
| " <td>Mediterranean Restaurant</td>\n", | |
| " <td>Pool</td>\n", | |
| " <td>Eastern European Restaurant</td>\n", | |
| " <td>Discount Store</td>\n", | |
| " <td>Doner Restaurant</td>\n", | |
| " <td>Donut Shop</td>\n", | |
| " <td>Drugstore</td>\n", | |
| " <td>Dumpling Restaurant</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>28</th>\n", | |
| " <td>North York</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " <td>Deli / Bodega</td>\n", | |
| " <td>Restaurant</td>\n", | |
| " <td>Bank</td>\n", | |
| " <td>Supermarket</td>\n", | |
| " <td>Fried Chicken Joint</td>\n", | |
| " <td>Frozen Yogurt Shop</td>\n", | |
| " <td>Middle Eastern Restaurant</td>\n", | |
| " <td>Diner</td>\n", | |
| " <td>Sandwich Place</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>29</th>\n", | |
| " <td>East York</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Indian Restaurant</td>\n", | |
| " <td>Yoga Studio</td>\n", | |
| " <td>Pharmacy</td>\n", | |
| " <td>Supermarket</td>\n", | |
| " <td>Sandwich Place</td>\n", | |
| " <td>Bus Line</td>\n", | |
| " <td>Burger Joint</td>\n", | |
| " <td>Bank</td>\n", | |
| " <td>Pizza Place</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>30</th>\n", | |
| " <td>Downtown Toronto</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " <td>Café</td>\n", | |
| " <td>Steakhouse</td>\n", | |
| " <td>Bar</td>\n", | |
| " <td>Thai Restaurant</td>\n", | |
| " <td>American Restaurant</td>\n", | |
| " <td>Bakery</td>\n", | |
| " <td>Cosmetics Shop</td>\n", | |
| " <td>Burger Joint</td>\n", | |
| " <td>Hotel</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>31</th>\n", | |
| " <td>West Toronto</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Bakery</td>\n", | |
| " <td>Pharmacy</td>\n", | |
| " <td>Supermarket</td>\n", | |
| " <td>Gym / Fitness Center</td>\n", | |
| " <td>Park</td>\n", | |
| " <td>Music Venue</td>\n", | |
| " <td>Pool</td>\n", | |
| " <td>Discount Store</td>\n", | |
| " <td>Middle Eastern Restaurant</td>\n", | |
| " <td>Café</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>33</th>\n", | |
| " <td>North York</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Clothing Store</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " <td>Fast Food Restaurant</td>\n", | |
| " <td>Asian Restaurant</td>\n", | |
| " <td>Cosmetics Shop</td>\n", | |
| " <td>Bus Station</td>\n", | |
| " <td>Restaurant</td>\n", | |
| " <td>Bakery</td>\n", | |
| " <td>Food Court</td>\n", | |
| " <td>Japanese Restaurant</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>34</th>\n", | |
| " <td>North York</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Metro Station</td>\n", | |
| " <td>Falafel Restaurant</td>\n", | |
| " <td>Massage Studio</td>\n", | |
| " <td>Caribbean Restaurant</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " <td>Miscellaneous Shop</td>\n", | |
| " <td>Bar</td>\n", | |
| " <td>Dumpling Restaurant</td>\n", | |
| " <td>Doner Restaurant</td>\n", | |
| " <td>Donut Shop</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>36</th>\n", | |
| " <td>Downtown Toronto</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " <td>Hotel</td>\n", | |
| " <td>Aquarium</td>\n", | |
| " <td>Café</td>\n", | |
| " <td>Italian Restaurant</td>\n", | |
| " <td>Scenic Lookout</td>\n", | |
| " <td>Brewery</td>\n", | |
| " <td>Restaurant</td>\n", | |
| " <td>Bakery</td>\n", | |
| " <td>Pizza Place</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>...</th>\n", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " <td>...</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>65</th>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Indian Restaurant</td>\n", | |
| " <td>Pet Store</td>\n", | |
| " <td>Vietnamese Restaurant</td>\n", | |
| " <td>Latin American Restaurant</td>\n", | |
| " <td>Chinese Restaurant</td>\n", | |
| " <td>Furniture / Home Store</td>\n", | |
| " <td>Thrift / Vintage Store</td>\n", | |
| " <td>Doner Restaurant</td>\n", | |
| " <td>Dim Sum Restaurant</td>\n", | |
| " <td>Diner</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>67</th>\n", | |
| " <td>Central Toronto</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Food & Drink Shop</td>\n", | |
| " <td>Park</td>\n", | |
| " <td>Gym</td>\n", | |
| " <td>Sandwich Place</td>\n", | |
| " <td>Breakfast Spot</td>\n", | |
| " <td>Hotel</td>\n", | |
| " <td>Yoga Studio</td>\n", | |
| " <td>Discount Store</td>\n", | |
| " <td>Dog Run</td>\n", | |
| " <td>Doner Restaurant</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>69</th>\n", | |
| " <td>West Toronto</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Café</td>\n", | |
| " <td>Bar</td>\n", | |
| " <td>Mexican Restaurant</td>\n", | |
| " <td>Diner</td>\n", | |
| " <td>Antique Shop</td>\n", | |
| " <td>Speakeasy</td>\n", | |
| " <td>Gastropub</td>\n", | |
| " <td>Thai Restaurant</td>\n", | |
| " <td>Arts & Crafts Store</td>\n", | |
| " <td>Flea Market</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>70</th>\n", | |
| " <td>Etobicoke</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Intersection</td>\n", | |
| " <td>Middle Eastern Restaurant</td>\n", | |
| " <td>Pizza Place</td>\n", | |
| " <td>Sandwich Place</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " <td>Chinese Restaurant</td>\n", | |
| " <td>Discount Store</td>\n", | |
| " <td>Dog Run</td>\n", | |
| " <td>Doner Restaurant</td>\n", | |
| " <td>Donut Shop</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>71</th>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Smoke Shop</td>\n", | |
| " <td>Breakfast Spot</td>\n", | |
| " <td>Bakery</td>\n", | |
| " <td>Shopping Mall</td>\n", | |
| " <td>Auto Garage</td>\n", | |
| " <td>Sandwich Place</td>\n", | |
| " <td>Yoga Studio</td>\n", | |
| " <td>Drugstore</td>\n", | |
| " <td>Dog Run</td>\n", | |
| " <td>Doner Restaurant</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>72</th>\n", | |
| " <td>North York</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Pharmacy</td>\n", | |
| " <td>Pizza Place</td>\n", | |
| " <td>Discount Store</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " <td>Dumpling Restaurant</td>\n", | |
| " <td>Diner</td>\n", | |
| " <td>Dog Run</td>\n", | |
| " <td>Doner Restaurant</td>\n", | |
| " <td>Donut Shop</td>\n", | |
| " <td>Drugstore</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>73</th>\n", | |
| " <td>Central Toronto</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Clothing Store</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " <td>Yoga Studio</td>\n", | |
| " <td>Sporting Goods Shop</td>\n", | |
| " <td>Gift Shop</td>\n", | |
| " <td>Fast Food Restaurant</td>\n", | |
| " <td>Mexican Restaurant</td>\n", | |
| " <td>Miscellaneous Shop</td>\n", | |
| " <td>Diner</td>\n", | |
| " <td>Dessert Shop</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>74</th>\n", | |
| " <td>Central Toronto</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Sandwich Place</td>\n", | |
| " <td>Café</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " <td>Pizza Place</td>\n", | |
| " <td>Liquor Store</td>\n", | |
| " <td>Burger Joint</td>\n", | |
| " <td>Jewish Restaurant</td>\n", | |
| " <td>BBQ Joint</td>\n", | |
| " <td>Indian Restaurant</td>\n", | |
| " <td>American Restaurant</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>75</th>\n", | |
| " <td>West Toronto</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Gift Shop</td>\n", | |
| " <td>Breakfast Spot</td>\n", | |
| " <td>Italian Restaurant</td>\n", | |
| " <td>Eastern European Restaurant</td>\n", | |
| " <td>Bar</td>\n", | |
| " <td>Bank</td>\n", | |
| " <td>Dog Run</td>\n", | |
| " <td>Restaurant</td>\n", | |
| " <td>Movie Theater</td>\n", | |
| " <td>Dessert Shop</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>76</th>\n", | |
| " <td>Mississauga</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " <td>Hotel</td>\n", | |
| " <td>American Restaurant</td>\n", | |
| " <td>Gym / Fitness Center</td>\n", | |
| " <td>Fried Chicken Joint</td>\n", | |
| " <td>Mediterranean Restaurant</td>\n", | |
| " <td>Sandwich Place</td>\n", | |
| " <td>Burrito Place</td>\n", | |
| " <td>Dumpling Restaurant</td>\n", | |
| " <td>Dog Run</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>78</th>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Lounge</td>\n", | |
| " <td>Breakfast Spot</td>\n", | |
| " <td>Skating Rink</td>\n", | |
| " <td>Clothing Store</td>\n", | |
| " <td>Yoga Studio</td>\n", | |
| " <td>Electronics Store</td>\n", | |
| " <td>Doner Restaurant</td>\n", | |
| " <td>Donut Shop</td>\n", | |
| " <td>Drugstore</td>\n", | |
| " <td>Dumpling Restaurant</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>79</th>\n", | |
| " <td>Central Toronto</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Pizza Place</td>\n", | |
| " <td>Sandwich Place</td>\n", | |
| " <td>Dessert Shop</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " <td>Restaurant</td>\n", | |
| " <td>Café</td>\n", | |
| " <td>Italian Restaurant</td>\n", | |
| " <td>Pharmacy</td>\n", | |
| " <td>Sushi Restaurant</td>\n", | |
| " <td>Thai Restaurant</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>80</th>\n", | |
| " <td>Downtown Toronto</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Café</td>\n", | |
| " <td>Bakery</td>\n", | |
| " <td>Bar</td>\n", | |
| " <td>Italian Restaurant</td>\n", | |
| " <td>Japanese Restaurant</td>\n", | |
| " <td>Bookstore</td>\n", | |
| " <td>Restaurant</td>\n", | |
| " <td>Poutine Place</td>\n", | |
| " <td>Beer Bar</td>\n", | |
| " <td>Beer Store</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>81</th>\n", | |
| " <td>West Toronto</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Pizza Place</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " <td>Café</td>\n", | |
| " <td>Sushi Restaurant</td>\n", | |
| " <td>Gym</td>\n", | |
| " <td>Italian Restaurant</td>\n", | |
| " <td>Scenic Lookout</td>\n", | |
| " <td>Bar</td>\n", | |
| " <td>Food</td>\n", | |
| " <td>Fish & Chips Shop</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>82</th>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Pizza Place</td>\n", | |
| " <td>Pharmacy</td>\n", | |
| " <td>Noodle House</td>\n", | |
| " <td>Bank</td>\n", | |
| " <td>Fried Chicken Joint</td>\n", | |
| " <td>Italian Restaurant</td>\n", | |
| " <td>Thai Restaurant</td>\n", | |
| " <td>Chinese Restaurant</td>\n", | |
| " <td>Fast Food Restaurant</td>\n", | |
| " <td>Cosmetics Shop</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>84</th>\n", | |
| " <td>Downtown Toronto</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Café</td>\n", | |
| " <td>Vegetarian / Vegan Restaurant</td>\n", | |
| " <td>Dumpling Restaurant</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " <td>Bakery</td>\n", | |
| " <td>Mexican Restaurant</td>\n", | |
| " <td>Bar</td>\n", | |
| " <td>Vietnamese Restaurant</td>\n", | |
| " <td>Chinese Restaurant</td>\n", | |
| " <td>Noodle House</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>86</th>\n", | |
| " <td>Central Toronto</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Pub</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " <td>Light Rail Station</td>\n", | |
| " <td>American Restaurant</td>\n", | |
| " <td>Fried Chicken Joint</td>\n", | |
| " <td>Supermarket</td>\n", | |
| " <td>Sports Bar</td>\n", | |
| " <td>Sushi Restaurant</td>\n", | |
| " <td>Bagel Shop</td>\n", | |
| " <td>Pizza Place</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>87</th>\n", | |
| " <td>Downtown Toronto</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Airport Service</td>\n", | |
| " <td>Airport Terminal</td>\n", | |
| " <td>Airport Lounge</td>\n", | |
| " <td>Airport Gate</td>\n", | |
| " <td>Sculpture Garden</td>\n", | |
| " <td>Plane</td>\n", | |
| " <td>Boat or Ferry</td>\n", | |
| " <td>Airport Food Court</td>\n", | |
| " <td>Airport</td>\n", | |
| " <td>Boutique</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>88</th>\n", | |
| " <td>Etobicoke</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Café</td>\n", | |
| " <td>Pet Store</td>\n", | |
| " <td>American Restaurant</td>\n", | |
| " <td>Fried Chicken Joint</td>\n", | |
| " <td>Mexican Restaurant</td>\n", | |
| " <td>Sandwich Place</td>\n", | |
| " <td>Seafood Restaurant</td>\n", | |
| " <td>Bakery</td>\n", | |
| " <td>Restaurant</td>\n", | |
| " <td>Fast Food Restaurant</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>89</th>\n", | |
| " <td>Etobicoke</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Grocery Store</td>\n", | |
| " <td>Pharmacy</td>\n", | |
| " <td>Video Store</td>\n", | |
| " <td>Sandwich Place</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " <td>Beer Store</td>\n", | |
| " <td>Fried Chicken Joint</td>\n", | |
| " <td>Pizza Place</td>\n", | |
| " <td>Fast Food Restaurant</td>\n", | |
| " <td>Empanada Restaurant</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>90</th>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Fast Food Restaurant</td>\n", | |
| " <td>Chinese Restaurant</td>\n", | |
| " <td>Pharmacy</td>\n", | |
| " <td>Breakfast Spot</td>\n", | |
| " <td>Sandwich Place</td>\n", | |
| " <td>Nail Salon</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " <td>Camera Store</td>\n", | |
| " <td>Pizza Place</td>\n", | |
| " <td>Grocery Store</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>92</th>\n", | |
| " <td>Downtown Toronto</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " <td>Restaurant</td>\n", | |
| " <td>Café</td>\n", | |
| " <td>Seafood Restaurant</td>\n", | |
| " <td>Beer Bar</td>\n", | |
| " <td>Hotel</td>\n", | |
| " <td>Italian Restaurant</td>\n", | |
| " <td>Cocktail Bar</td>\n", | |
| " <td>Park</td>\n", | |
| " <td>Fast Food Restaurant</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>93</th>\n", | |
| " <td>Etobicoke</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Pizza Place</td>\n", | |
| " <td>Gym</td>\n", | |
| " <td>Skating Rink</td>\n", | |
| " <td>Pharmacy</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " <td>Athletics & Sports</td>\n", | |
| " <td>Sandwich Place</td>\n", | |
| " <td>Pool</td>\n", | |
| " <td>Pub</td>\n", | |
| " <td>Yoga Studio</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>94</th>\n", | |
| " <td>Etobicoke</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Rental Car Location</td>\n", | |
| " <td>Drugstore</td>\n", | |
| " <td>Bar</td>\n", | |
| " <td>Yoga Studio</td>\n", | |
| " <td>Dim Sum Restaurant</td>\n", | |
| " <td>Discount Store</td>\n", | |
| " <td>Dog Run</td>\n", | |
| " <td>Doner Restaurant</td>\n", | |
| " <td>Donut Shop</td>\n", | |
| " <td>Dumpling Restaurant</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>96</th>\n", | |
| " <td>Downtown Toronto</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " <td>Park</td>\n", | |
| " <td>Café</td>\n", | |
| " <td>Restaurant</td>\n", | |
| " <td>Market</td>\n", | |
| " <td>Pub</td>\n", | |
| " <td>Italian Restaurant</td>\n", | |
| " <td>Pizza Place</td>\n", | |
| " <td>Bakery</td>\n", | |
| " <td>Gastropub</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>97</th>\n", | |
| " <td>Downtown Toronto</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Café</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " <td>Hotel</td>\n", | |
| " <td>Bar</td>\n", | |
| " <td>Burger Joint</td>\n", | |
| " <td>Bakery</td>\n", | |
| " <td>Restaurant</td>\n", | |
| " <td>Steakhouse</td>\n", | |
| " <td>Gastropub</td>\n", | |
| " <td>American Restaurant</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>99</th>\n", | |
| " <td>Downtown Toronto</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " <td>Japanese Restaurant</td>\n", | |
| " <td>Sushi Restaurant</td>\n", | |
| " <td>Gay Bar</td>\n", | |
| " <td>Restaurant</td>\n", | |
| " <td>Café</td>\n", | |
| " <td>Men's Store</td>\n", | |
| " <td>Mediterranean Restaurant</td>\n", | |
| " <td>Hotel</td>\n", | |
| " <td>Gastropub</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>100</th>\n", | |
| " <td>East Toronto</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Light Rail Station</td>\n", | |
| " <td>Gym / Fitness Center</td>\n", | |
| " <td>Garden Center</td>\n", | |
| " <td>Skate Park</td>\n", | |
| " <td>Brewery</td>\n", | |
| " <td>Farmers Market</td>\n", | |
| " <td>Spa</td>\n", | |
| " <td>Fast Food Restaurant</td>\n", | |
| " <td>Burrito Place</td>\n", | |
| " <td>Restaurant</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>101</th>\n", | |
| " <td>Etobicoke</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Baseball Field</td>\n", | |
| " <td>Locksmith</td>\n", | |
| " <td>Yoga Studio</td>\n", | |
| " <td>Dog Run</td>\n", | |
| " <td>Doner Restaurant</td>\n", | |
| " <td>Donut Shop</td>\n", | |
| " <td>Drugstore</td>\n", | |
| " <td>Dumpling Restaurant</td>\n", | |
| " <td>Eastern European Restaurant</td>\n", | |
| " <td>Electronics Store</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>102</th>\n", | |
| " <td>Etobicoke</td>\n", | |
| " <td>0</td>\n", | |
| " <td>Sandwich Place</td>\n", | |
| " <td>Thrift / Vintage Store</td>\n", | |
| " <td>Wings Joint</td>\n", | |
| " <td>Fast Food Restaurant</td>\n", | |
| " <td>Bakery</td>\n", | |
| " <td>Gym</td>\n", | |
| " <td>Grocery Store</td>\n", | |
| " <td>Supplement Shop</td>\n", | |
| " <td>Burrito Place</td>\n", | |
| " <td>Convenience Store</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "<p>81 rows × 12 columns</p>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " Borough Cluster_Labels 1st Most Common Venue \\\n", | |
| "1 North York 0 Intersection \n", | |
| "2 Downtown Toronto 0 Coffee Shop \n", | |
| "3 North York 0 Clothing Store \n", | |
| "4 Queen's Park 0 Coffee Shop \n", | |
| "7 North York 0 Basketball Court \n", | |
| "8 East York 0 Fast Food Restaurant \n", | |
| "9 Downtown Toronto 0 Coffee Shop \n", | |
| "11 Etobicoke 0 Bank \n", | |
| "12 Scarborough 0 History Museum \n", | |
| "13 North York 0 Gym \n", | |
| "14 East York 0 Skating Rink \n", | |
| "15 Downtown Toronto 0 Coffee Shop \n", | |
| "16 York 0 Field \n", | |
| "17 Etobicoke 0 Pharmacy \n", | |
| "18 Scarborough 0 Intersection \n", | |
| "19 East Toronto 0 Health Food Store \n", | |
| "20 Downtown Toronto 0 Coffee Shop \n", | |
| "22 Scarborough 0 Coffee Shop \n", | |
| "23 East York 0 Coffee Shop \n", | |
| "24 Downtown Toronto 0 Coffee Shop \n", | |
| "25 Downtown Toronto 0 Café \n", | |
| "26 Scarborough 0 Athletics & Sports \n", | |
| "27 North York 0 Golf Course \n", | |
| "28 North York 0 Coffee Shop \n", | |
| "29 East York 0 Indian Restaurant \n", | |
| "30 Downtown Toronto 0 Coffee Shop \n", | |
| "31 West Toronto 0 Bakery \n", | |
| "33 North York 0 Clothing Store \n", | |
| "34 North York 0 Metro Station \n", | |
| "36 Downtown Toronto 0 Coffee Shop \n", | |
| ".. ... ... ... \n", | |
| "65 Scarborough 0 Indian Restaurant \n", | |
| "67 Central Toronto 0 Food & Drink Shop \n", | |
| "69 West Toronto 0 Café \n", | |
| "70 Etobicoke 0 Intersection \n", | |
| "71 Scarborough 0 Smoke Shop \n", | |
| "72 North York 0 Pharmacy \n", | |
| "73 Central Toronto 0 Clothing Store \n", | |
| "74 Central Toronto 0 Sandwich Place \n", | |
| "75 West Toronto 0 Gift Shop \n", | |
| "76 Mississauga 0 Coffee Shop \n", | |
| "78 Scarborough 0 Lounge \n", | |
| "79 Central Toronto 0 Pizza Place \n", | |
| "80 Downtown Toronto 0 Café \n", | |
| "81 West Toronto 0 Pizza Place \n", | |
| "82 Scarborough 0 Pizza Place \n", | |
| "84 Downtown Toronto 0 Café \n", | |
| "86 Central Toronto 0 Pub \n", | |
| "87 Downtown Toronto 0 Airport Service \n", | |
| "88 Etobicoke 0 Café \n", | |
| "89 Etobicoke 0 Grocery Store \n", | |
| "90 Scarborough 0 Fast Food Restaurant \n", | |
| "92 Downtown Toronto 0 Coffee Shop \n", | |
| "93 Etobicoke 0 Pizza Place \n", | |
| "94 Etobicoke 0 Rental Car Location \n", | |
| "96 Downtown Toronto 0 Coffee Shop \n", | |
| "97 Downtown Toronto 0 Café \n", | |
| "99 Downtown Toronto 0 Coffee Shop \n", | |
| "100 East Toronto 0 Light Rail Station \n", | |
| "101 Etobicoke 0 Baseball Field \n", | |
| "102 Etobicoke 0 Sandwich Place \n", | |
| "\n", | |
| " 2nd Most Common Venue 3rd Most Common Venue \\\n", | |
| "1 Hockey Arena Coffee Shop \n", | |
| "2 Pub Bakery \n", | |
| "3 Furniture / Home Store Women's Store \n", | |
| "4 Gym Japanese Restaurant \n", | |
| "7 Baseball Field Caribbean Restaurant \n", | |
| "8 Pizza Place Gastropub \n", | |
| "9 Clothing Store Café \n", | |
| "11 Yoga Studio Eastern European Restaurant \n", | |
| "12 Bar Eastern European Restaurant \n", | |
| "13 Asian Restaurant Coffee Shop \n", | |
| "14 Pharmacy Athletics & Sports \n", | |
| "15 Café Restaurant \n", | |
| "16 Dog Run Hockey Arena \n", | |
| "17 Liquor Store Pizza Place \n", | |
| "18 Spa Pizza Place \n", | |
| "19 Pub Astrologer \n", | |
| "20 Cocktail Bar Restaurant \n", | |
| "22 Pharmacy Korean Restaurant \n", | |
| "23 Sporting Goods Shop Grocery Store \n", | |
| "24 Café Italian Restaurant \n", | |
| "25 Grocery Store Park \n", | |
| "26 Hakka Restaurant Caribbean Restaurant \n", | |
| "27 Dog Run Mediterranean Restaurant \n", | |
| "28 Deli / Bodega Restaurant \n", | |
| "29 Yoga Studio Pharmacy \n", | |
| "30 Café Steakhouse \n", | |
| "31 Pharmacy Supermarket \n", | |
| "33 Coffee Shop Fast Food Restaurant \n", | |
| "34 Falafel Restaurant Massage Studio \n", | |
| "36 Hotel Aquarium \n", | |
| ".. ... ... \n", | |
| "65 Pet Store Vietnamese Restaurant \n", | |
| "67 Park Gym \n", | |
| "69 Bar Mexican Restaurant \n", | |
| "70 Middle Eastern Restaurant Pizza Place \n", | |
| "71 Breakfast Spot Bakery \n", | |
| "72 Pizza Place Discount Store \n", | |
| "73 Coffee Shop Yoga Studio \n", | |
| "74 Café Coffee Shop \n", | |
| "75 Breakfast Spot Italian Restaurant \n", | |
| "76 Hotel American Restaurant \n", | |
| "78 Breakfast Spot Skating Rink \n", | |
| "79 Sandwich Place Dessert Shop \n", | |
| "80 Bakery Bar \n", | |
| "81 Coffee Shop Café \n", | |
| "82 Pharmacy Noodle House \n", | |
| "84 Vegetarian / Vegan Restaurant Dumpling Restaurant \n", | |
| "86 Coffee Shop Light Rail Station \n", | |
| "87 Airport Terminal Airport Lounge \n", | |
| "88 Pet Store American Restaurant \n", | |
| "89 Pharmacy Video Store \n", | |
| "90 Chinese Restaurant Pharmacy \n", | |
| "92 Restaurant Café \n", | |
| "93 Gym Skating Rink \n", | |
| "94 Drugstore Bar \n", | |
| "96 Park Café \n", | |
| "97 Coffee Shop Hotel \n", | |
| "99 Japanese Restaurant Sushi Restaurant \n", | |
| "100 Gym / Fitness Center Garden Center \n", | |
| "101 Locksmith Yoga Studio \n", | |
| "102 Thrift / Vintage Store Wings Joint \n", | |
| "\n", | |
| " 4th Most Common Venue 5th Most Common Venue \\\n", | |
| "1 Portuguese Restaurant Pizza Place \n", | |
| "2 Park Mexican Restaurant \n", | |
| "3 Boutique Gift Shop \n", | |
| "4 Sushi Restaurant Park \n", | |
| "7 Café Japanese Restaurant \n", | |
| "8 Breakfast Spot Café \n", | |
| "9 Cosmetics Shop Middle Eastern Restaurant \n", | |
| "11 Dog Run Doner Restaurant \n", | |
| "12 Dog Run Doner Restaurant \n", | |
| "13 Beer Store Italian Restaurant \n", | |
| "14 Cosmetics Shop Curling Ice \n", | |
| "15 Hotel Cosmetics Shop \n", | |
| "16 Trail Eastern European Restaurant \n", | |
| "17 Convenience Store Café \n", | |
| "18 Breakfast Spot Electronics Store \n", | |
| "19 Grocery Store Neighborhood \n", | |
| "20 Cheese Shop Steakhouse \n", | |
| "22 Discount Store Dog Run \n", | |
| "23 Burger Joint Furniture / Home Store \n", | |
| "24 Middle Eastern Restaurant Sandwich Place \n", | |
| "25 Coffee Shop Diner \n", | |
| "26 Bakery Thai Restaurant \n", | |
| "27 Pool Eastern European Restaurant \n", | |
| "28 Bank Supermarket \n", | |
| "29 Supermarket Sandwich Place \n", | |
| "30 Bar Thai Restaurant \n", | |
| "31 Gym / Fitness Center Park \n", | |
| "33 Asian Restaurant Cosmetics Shop \n", | |
| "34 Caribbean Restaurant Coffee Shop \n", | |
| "36 Café Italian Restaurant \n", | |
| ".. ... ... \n", | |
| "65 Latin American Restaurant Chinese Restaurant \n", | |
| "67 Sandwich Place Breakfast Spot \n", | |
| "69 Diner Antique Shop \n", | |
| "70 Sandwich Place Coffee Shop \n", | |
| "71 Shopping Mall Auto Garage \n", | |
| "72 Coffee Shop Dumpling Restaurant \n", | |
| "73 Sporting Goods Shop Gift Shop \n", | |
| "74 Pizza Place Liquor Store \n", | |
| "75 Eastern European Restaurant Bar \n", | |
| "76 Gym / Fitness Center Fried Chicken Joint \n", | |
| "78 Clothing Store Yoga Studio \n", | |
| "79 Coffee Shop Restaurant \n", | |
| "80 Italian Restaurant Japanese Restaurant \n", | |
| "81 Sushi Restaurant Gym \n", | |
| "82 Bank Fried Chicken Joint \n", | |
| "84 Coffee Shop Bakery \n", | |
| "86 American Restaurant Fried Chicken Joint \n", | |
| "87 Airport Gate Sculpture Garden \n", | |
| "88 Fried Chicken Joint Mexican Restaurant \n", | |
| "89 Sandwich Place Coffee Shop \n", | |
| "90 Breakfast Spot Sandwich Place \n", | |
| "92 Seafood Restaurant Beer Bar \n", | |
| "93 Pharmacy Coffee Shop \n", | |
| "94 Yoga Studio Dim Sum Restaurant \n", | |
| "96 Restaurant Market \n", | |
| "97 Bar Burger Joint \n", | |
| "99 Gay Bar Restaurant \n", | |
| "100 Skate Park Brewery \n", | |
| "101 Dog Run Doner Restaurant \n", | |
| "102 Fast Food Restaurant Bakery \n", | |
| "\n", | |
| " 6th Most Common Venue 7th Most Common Venue \\\n", | |
| "1 Event Space Ethiopian Restaurant \n", | |
| "2 Theater Breakfast Spot \n", | |
| "3 Event Space Miscellaneous Shop \n", | |
| "4 Persian Restaurant Smoothie Shop \n", | |
| "7 Gym / Fitness Center Event Space \n", | |
| "8 Bank Rock Climbing Spot \n", | |
| "9 Ramen Restaurant Pizza Place \n", | |
| "11 Donut Shop Drugstore \n", | |
| "12 Donut Shop Drugstore \n", | |
| "13 General Entertainment Dim Sum Restaurant \n", | |
| "14 Beer Store Park \n", | |
| "15 Bakery Breakfast Spot \n", | |
| "16 Discount Store Doner Restaurant \n", | |
| "17 Shopping Plaza Beer Store \n", | |
| "18 Medical Center Rental Car Location \n", | |
| "19 Diner Discount Store \n", | |
| "20 Italian Restaurant Beer Bar \n", | |
| "22 Doner Restaurant Donut Shop \n", | |
| "23 Breakfast Spot Supermarket \n", | |
| "24 Burger Joint Ice Cream Shop \n", | |
| "25 Italian Restaurant Baby Store \n", | |
| "26 Bank Fried Chicken Joint \n", | |
| "27 Discount Store Doner Restaurant \n", | |
| "28 Fried Chicken Joint Frozen Yogurt Shop \n", | |
| "29 Bus Line Burger Joint \n", | |
| "30 American Restaurant Bakery \n", | |
| "31 Music Venue Pool \n", | |
| "33 Bus Station Restaurant \n", | |
| "34 Miscellaneous Shop Bar \n", | |
| "36 Scenic Lookout Brewery \n", | |
| ".. ... ... \n", | |
| "65 Furniture / Home Store Thrift / Vintage Store \n", | |
| "67 Hotel Yoga Studio \n", | |
| "69 Speakeasy Gastropub \n", | |
| "70 Chinese Restaurant Discount Store \n", | |
| "71 Sandwich Place Yoga Studio \n", | |
| "72 Diner Dog Run \n", | |
| "73 Fast Food Restaurant Mexican Restaurant \n", | |
| "74 Burger Joint Jewish Restaurant \n", | |
| "75 Bank Dog Run \n", | |
| "76 Mediterranean Restaurant Sandwich Place \n", | |
| "78 Electronics Store Doner Restaurant \n", | |
| "79 Café Italian Restaurant \n", | |
| "80 Bookstore Restaurant \n", | |
| "81 Italian Restaurant Scenic Lookout \n", | |
| "82 Italian Restaurant Thai Restaurant \n", | |
| "84 Mexican Restaurant Bar \n", | |
| "86 Supermarket Sports Bar \n", | |
| "87 Plane Boat or Ferry \n", | |
| "88 Sandwich Place Seafood Restaurant \n", | |
| "89 Beer Store Fried Chicken Joint \n", | |
| "90 Nail Salon Coffee Shop \n", | |
| "92 Hotel Italian Restaurant \n", | |
| "93 Athletics & Sports Sandwich Place \n", | |
| "94 Discount Store Dog Run \n", | |
| "96 Pub Italian Restaurant \n", | |
| "97 Bakery Restaurant \n", | |
| "99 Café Men's Store \n", | |
| "100 Farmers Market Spa \n", | |
| "101 Donut Shop Drugstore \n", | |
| "102 Gym Grocery Store \n", | |
| "\n", | |
| " 8th Most Common Venue 9th Most Common Venue \\\n", | |
| "1 Empanada Restaurant Falafel Restaurant \n", | |
| "2 Café Gym / Fitness Center \n", | |
| "3 Coffee Shop Accessories Store \n", | |
| "4 Seafood Restaurant Sandwich Place \n", | |
| "7 Ethiopian Restaurant Empanada Restaurant \n", | |
| "8 Athletics & Sports Pharmacy \n", | |
| "9 Italian Restaurant Japanese Restaurant \n", | |
| "11 Dumpling Restaurant Electronics Store \n", | |
| "12 Dumpling Restaurant Electronics Store \n", | |
| "13 Discount Store Japanese Restaurant \n", | |
| "14 Video Store Greek Restaurant \n", | |
| "15 Clothing Store Gastropub \n", | |
| "16 Donut Shop Drugstore \n", | |
| "17 Park Gluten-free Restaurant \n", | |
| "18 Mexican Restaurant Donut Shop \n", | |
| "19 Dog Run Doner Restaurant \n", | |
| "20 Bakery Farmers Market \n", | |
| "22 Drugstore Dumpling Restaurant \n", | |
| "23 Sports Bar Fish & Chips Shop \n", | |
| "24 Indian Restaurant Bar \n", | |
| "25 Athletics & Sports Nightclub \n", | |
| "26 Drugstore Dog Run \n", | |
| "27 Donut Shop Drugstore \n", | |
| "28 Middle Eastern Restaurant Diner \n", | |
| "29 Bank Pizza Place \n", | |
| "30 Cosmetics Shop Burger Joint \n", | |
| "31 Discount Store Middle Eastern Restaurant \n", | |
| "33 Bakery Food Court \n", | |
| "34 Dumpling Restaurant Doner Restaurant \n", | |
| "36 Restaurant Bakery \n", | |
| ".. ... ... \n", | |
| "65 Doner Restaurant Dim Sum Restaurant \n", | |
| "67 Discount Store Dog Run \n", | |
| "69 Thai Restaurant Arts & Crafts Store \n", | |
| "70 Dog Run Doner Restaurant \n", | |
| "71 Drugstore Dog Run \n", | |
| "72 Doner Restaurant Donut Shop \n", | |
| "73 Miscellaneous Shop Diner \n", | |
| "74 BBQ Joint Indian Restaurant \n", | |
| "75 Restaurant Movie Theater \n", | |
| "76 Burrito Place Dumpling Restaurant \n", | |
| "78 Donut Shop Drugstore \n", | |
| "79 Pharmacy Sushi Restaurant \n", | |
| "80 Poutine Place Beer Bar \n", | |
| "81 Bar Food \n", | |
| "82 Chinese Restaurant Fast Food Restaurant \n", | |
| "84 Vietnamese Restaurant Chinese Restaurant \n", | |
| "86 Sushi Restaurant Bagel Shop \n", | |
| "87 Airport Food Court Airport \n", | |
| "88 Bakery Restaurant \n", | |
| "89 Pizza Place Fast Food Restaurant \n", | |
| "90 Camera Store Pizza Place \n", | |
| "92 Cocktail Bar Park \n", | |
| "93 Pool Pub \n", | |
| "94 Doner Restaurant Donut Shop \n", | |
| "96 Pizza Place Bakery \n", | |
| "97 Steakhouse Gastropub \n", | |
| "99 Mediterranean Restaurant Hotel \n", | |
| "100 Fast Food Restaurant Burrito Place \n", | |
| "101 Dumpling Restaurant Eastern European Restaurant \n", | |
| "102 Supplement Shop Burrito Place \n", | |
| "\n", | |
| " 10th Most Common Venue \n", | |
| "1 Electronics Store \n", | |
| "2 Health Food Store \n", | |
| "3 Vietnamese Restaurant \n", | |
| "4 Burger Joint \n", | |
| "7 Electronics Store \n", | |
| "8 Intersection \n", | |
| "9 Tea Room \n", | |
| "11 Diner \n", | |
| "12 Diner \n", | |
| "13 Chinese Restaurant \n", | |
| "14 Donut Shop \n", | |
| "15 Seafood Restaurant \n", | |
| "16 Dumpling Restaurant \n", | |
| "17 Gift Shop \n", | |
| "18 Diner \n", | |
| "19 Donut Shop \n", | |
| "20 Seafood Restaurant \n", | |
| "22 Eastern European Restaurant \n", | |
| "23 Beer Store \n", | |
| "24 Japanese Restaurant \n", | |
| "25 Restaurant \n", | |
| "26 Doner Restaurant \n", | |
| "27 Dumpling Restaurant \n", | |
| "28 Sandwich Place \n", | |
| "29 Coffee Shop \n", | |
| "30 Hotel \n", | |
| "31 Café \n", | |
| "33 Japanese Restaurant \n", | |
| "34 Donut Shop \n", | |
| "36 Pizza Place \n", | |
| ".. ... \n", | |
| "65 Diner \n", | |
| "67 Doner Restaurant \n", | |
| "69 Flea Market \n", | |
| "70 Donut Shop \n", | |
| "71 Doner Restaurant \n", | |
| "72 Drugstore \n", | |
| "73 Dessert Shop \n", | |
| "74 American Restaurant \n", | |
| "75 Dessert Shop \n", | |
| "76 Dog Run \n", | |
| "78 Dumpling Restaurant \n", | |
| "79 Thai Restaurant \n", | |
| "80 Beer Store \n", | |
| "81 Fish & Chips Shop \n", | |
| "82 Cosmetics Shop \n", | |
| "84 Noodle House \n", | |
| "86 Pizza Place \n", | |
| "87 Boutique \n", | |
| "88 Fast Food Restaurant \n", | |
| "89 Empanada Restaurant \n", | |
| "90 Grocery Store \n", | |
| "92 Fast Food Restaurant \n", | |
| "93 Yoga Studio \n", | |
| "94 Dumpling Restaurant \n", | |
| "96 Gastropub \n", | |
| "97 American Restaurant \n", | |
| "99 Gastropub \n", | |
| "100 Restaurant \n", | |
| "101 Electronics Store \n", | |
| "102 Convenience Store \n", | |
| "\n", | |
| "[81 rows x 12 columns]" | |
| ] | |
| }, | |
| "execution_count": 54, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "# cluster 1\n", | |
| "toronto_merged.loc[toronto_merged['Cluster_Labels'] == 0, toronto_merged.columns[[1] + list(range(5, toronto_merged.shape[1]))]]" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 55, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<div>\n", | |
| "<style scoped>\n", | |
| " .dataframe tbody tr th:only-of-type {\n", | |
| " vertical-align: middle;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe tbody tr th {\n", | |
| " vertical-align: top;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe thead th {\n", | |
| " text-align: right;\n", | |
| " }\n", | |
| "</style>\n", | |
| "<table border=\"1\" class=\"dataframe\">\n", | |
| " <thead>\n", | |
| " <tr style=\"text-align: right;\">\n", | |
| " <th></th>\n", | |
| " <th>Borough</th>\n", | |
| " <th>Cluster_Labels</th>\n", | |
| " <th>1st Most Common Venue</th>\n", | |
| " <th>2nd Most Common Venue</th>\n", | |
| " <th>3rd Most Common Venue</th>\n", | |
| " <th>4th Most Common Venue</th>\n", | |
| " <th>5th Most Common Venue</th>\n", | |
| " <th>6th Most Common Venue</th>\n", | |
| " <th>7th Most Common Venue</th>\n", | |
| " <th>8th Most Common Venue</th>\n", | |
| " <th>9th Most Common Venue</th>\n", | |
| " <th>10th Most Common Venue</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>35</th>\n", | |
| " <td>East York</td>\n", | |
| " <td>1</td>\n", | |
| " <td>Park</td>\n", | |
| " <td>Coffee Shop</td>\n", | |
| " <td>Convenience Store</td>\n", | |
| " <td>Yoga Studio</td>\n", | |
| " <td>Eastern European Restaurant</td>\n", | |
| " <td>Discount Store</td>\n", | |
| " <td>Dog Run</td>\n", | |
| " <td>Doner Restaurant</td>\n", | |
| " <td>Donut Shop</td>\n", | |
| " <td>Drugstore</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>64</th>\n", | |
| " <td>York</td>\n", | |
| " <td>1</td>\n", | |
| " <td>Park</td>\n", | |
| " <td>Convenience Store</td>\n", | |
| " <td>Yoga Studio</td>\n", | |
| " <td>Eastern European Restaurant</td>\n", | |
| " <td>Discount Store</td>\n", | |
| " <td>Dog Run</td>\n", | |
| " <td>Doner Restaurant</td>\n", | |
| " <td>Donut Shop</td>\n", | |
| " <td>Drugstore</td>\n", | |
| " <td>Dumpling Restaurant</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>66</th>\n", | |
| " <td>North York</td>\n", | |
| " <td>1</td>\n", | |
| " <td>Park</td>\n", | |
| " <td>Bank</td>\n", | |
| " <td>Convenience Store</td>\n", | |
| " <td>Yoga Studio</td>\n", | |
| " <td>Eastern European Restaurant</td>\n", | |
| " <td>Dog Run</td>\n", | |
| " <td>Doner Restaurant</td>\n", | |
| " <td>Donut Shop</td>\n", | |
| " <td>Drugstore</td>\n", | |
| " <td>Dumpling Restaurant</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " Borough Cluster_Labels 1st Most Common Venue 2nd Most Common Venue \\\n", | |
| "35 East York 1 Park Coffee Shop \n", | |
| "64 York 1 Park Convenience Store \n", | |
| "66 North York 1 Park Bank \n", | |
| "\n", | |
| " 3rd Most Common Venue 4th Most Common Venue \\\n", | |
| "35 Convenience Store Yoga Studio \n", | |
| "64 Yoga Studio Eastern European Restaurant \n", | |
| "66 Convenience Store Yoga Studio \n", | |
| "\n", | |
| " 5th Most Common Venue 6th Most Common Venue 7th Most Common Venue \\\n", | |
| "35 Eastern European Restaurant Discount Store Dog Run \n", | |
| "64 Discount Store Dog Run Doner Restaurant \n", | |
| "66 Eastern European Restaurant Dog Run Doner Restaurant \n", | |
| "\n", | |
| " 8th Most Common Venue 9th Most Common Venue 10th Most Common Venue \n", | |
| "35 Doner Restaurant Donut Shop Drugstore \n", | |
| "64 Donut Shop Drugstore Dumpling Restaurant \n", | |
| "66 Donut Shop Drugstore Dumpling Restaurant " | |
| ] | |
| }, | |
| "execution_count": 55, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "# cluster 2\n", | |
| "toronto_merged.loc[toronto_merged['Cluster_Labels'] == 1, toronto_merged.columns[[1] + list(range(5, toronto_merged.shape[1]))]]" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 56, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<div>\n", | |
| "<style scoped>\n", | |
| " .dataframe tbody tr th:only-of-type {\n", | |
| " vertical-align: middle;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe tbody tr th {\n", | |
| " vertical-align: top;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe thead th {\n", | |
| " text-align: right;\n", | |
| " }\n", | |
| "</style>\n", | |
| "<table border=\"1\" class=\"dataframe\">\n", | |
| " <thead>\n", | |
| " <tr style=\"text-align: right;\">\n", | |
| " <th></th>\n", | |
| " <th>Borough</th>\n", | |
| " <th>Cluster_Labels</th>\n", | |
| " <th>1st Most Common Venue</th>\n", | |
| " <th>2nd Most Common Venue</th>\n", | |
| " <th>3rd Most Common Venue</th>\n", | |
| " <th>4th Most Common Venue</th>\n", | |
| " <th>5th Most Common Venue</th>\n", | |
| " <th>6th Most Common Venue</th>\n", | |
| " <th>7th Most Common Venue</th>\n", | |
| " <th>8th Most Common Venue</th>\n", | |
| " <th>9th Most Common Venue</th>\n", | |
| " <th>10th Most Common Venue</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>32</th>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>2</td>\n", | |
| " <td>Playground</td>\n", | |
| " <td>Yoga Studio</td>\n", | |
| " <td>Dumpling Restaurant</td>\n", | |
| " <td>Diner</td>\n", | |
| " <td>Discount Store</td>\n", | |
| " <td>Dog Run</td>\n", | |
| " <td>Doner Restaurant</td>\n", | |
| " <td>Donut Shop</td>\n", | |
| " <td>Drugstore</td>\n", | |
| " <td>Eastern European Restaurant</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>83</th>\n", | |
| " <td>Central Toronto</td>\n", | |
| " <td>2</td>\n", | |
| " <td>Trail</td>\n", | |
| " <td>Park</td>\n", | |
| " <td>Tennis Court</td>\n", | |
| " <td>Playground</td>\n", | |
| " <td>Yoga Studio</td>\n", | |
| " <td>Diner</td>\n", | |
| " <td>Discount Store</td>\n", | |
| " <td>Dog Run</td>\n", | |
| " <td>Doner Restaurant</td>\n", | |
| " <td>Donut Shop</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>85</th>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>2</td>\n", | |
| " <td>Playground</td>\n", | |
| " <td>Park</td>\n", | |
| " <td>Yoga Studio</td>\n", | |
| " <td>Eastern European Restaurant</td>\n", | |
| " <td>Discount Store</td>\n", | |
| " <td>Dog Run</td>\n", | |
| " <td>Doner Restaurant</td>\n", | |
| " <td>Donut Shop</td>\n", | |
| " <td>Drugstore</td>\n", | |
| " <td>Dumpling Restaurant</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>91</th>\n", | |
| " <td>Downtown Toronto</td>\n", | |
| " <td>2</td>\n", | |
| " <td>Park</td>\n", | |
| " <td>Trail</td>\n", | |
| " <td>Playground</td>\n", | |
| " <td>Yoga Studio</td>\n", | |
| " <td>Diner</td>\n", | |
| " <td>Discount Store</td>\n", | |
| " <td>Dog Run</td>\n", | |
| " <td>Doner Restaurant</td>\n", | |
| " <td>Donut Shop</td>\n", | |
| " <td>Drugstore</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " Borough Cluster_Labels 1st Most Common Venue \\\n", | |
| "32 Scarborough 2 Playground \n", | |
| "83 Central Toronto 2 Trail \n", | |
| "85 Scarborough 2 Playground \n", | |
| "91 Downtown Toronto 2 Park \n", | |
| "\n", | |
| " 2nd Most Common Venue 3rd Most Common Venue 4th Most Common Venue \\\n", | |
| "32 Yoga Studio Dumpling Restaurant Diner \n", | |
| "83 Park Tennis Court Playground \n", | |
| "85 Park Yoga Studio Eastern European Restaurant \n", | |
| "91 Trail Playground Yoga Studio \n", | |
| "\n", | |
| " 5th Most Common Venue 6th Most Common Venue 7th Most Common Venue \\\n", | |
| "32 Discount Store Dog Run Doner Restaurant \n", | |
| "83 Yoga Studio Diner Discount Store \n", | |
| "85 Discount Store Dog Run Doner Restaurant \n", | |
| "91 Diner Discount Store Dog Run \n", | |
| "\n", | |
| " 8th Most Common Venue 9th Most Common Venue 10th Most Common Venue \n", | |
| "32 Donut Shop Drugstore Eastern European Restaurant \n", | |
| "83 Dog Run Doner Restaurant Donut Shop \n", | |
| "85 Donut Shop Drugstore Dumpling Restaurant \n", | |
| "91 Doner Restaurant Donut Shop Drugstore " | |
| ] | |
| }, | |
| "execution_count": 56, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "# cluster 3\n", | |
| "toronto_merged.loc[toronto_merged['Cluster_Labels'] == 2, toronto_merged.columns[[1] + list(range(5, toronto_merged.shape[1]))]]" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 57, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<div>\n", | |
| "<style scoped>\n", | |
| " .dataframe tbody tr th:only-of-type {\n", | |
| " vertical-align: middle;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe tbody tr th {\n", | |
| " vertical-align: top;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe thead th {\n", | |
| " text-align: right;\n", | |
| " }\n", | |
| "</style>\n", | |
| "<table border=\"1\" class=\"dataframe\">\n", | |
| " <thead>\n", | |
| " <tr style=\"text-align: right;\">\n", | |
| " <th></th>\n", | |
| " <th>Borough</th>\n", | |
| " <th>Cluster_Labels</th>\n", | |
| " <th>1st Most Common Venue</th>\n", | |
| " <th>2nd Most Common Venue</th>\n", | |
| " <th>3rd Most Common Venue</th>\n", | |
| " <th>4th Most Common Venue</th>\n", | |
| " <th>5th Most Common Venue</th>\n", | |
| " <th>6th Most Common Venue</th>\n", | |
| " <th>7th Most Common Venue</th>\n", | |
| " <th>8th Most Common Venue</th>\n", | |
| " <th>9th Most Common Venue</th>\n", | |
| " <th>10th Most Common Venue</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>6</th>\n", | |
| " <td>Scarborough</td>\n", | |
| " <td>3</td>\n", | |
| " <td>Fast Food Restaurant</td>\n", | |
| " <td>Yoga Studio</td>\n", | |
| " <td>Eastern European Restaurant</td>\n", | |
| " <td>Discount Store</td>\n", | |
| " <td>Dog Run</td>\n", | |
| " <td>Doner Restaurant</td>\n", | |
| " <td>Donut Shop</td>\n", | |
| " <td>Drugstore</td>\n", | |
| " <td>Dumpling Restaurant</td>\n", | |
| " <td>Electronics Store</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " Borough Cluster_Labels 1st Most Common Venue 2nd Most Common Venue \\\n", | |
| "6 Scarborough 3 Fast Food Restaurant Yoga Studio \n", | |
| "\n", | |
| " 3rd Most Common Venue 4th Most Common Venue 5th Most Common Venue \\\n", | |
| "6 Eastern European Restaurant Discount Store Dog Run \n", | |
| "\n", | |
| " 6th Most Common Venue 7th Most Common Venue 8th Most Common Venue \\\n", | |
| "6 Doner Restaurant Donut Shop Drugstore \n", | |
| "\n", | |
| " 9th Most Common Venue 10th Most Common Venue \n", | |
| "6 Dumpling Restaurant Electronics Store " | |
| ] | |
| }, | |
| "execution_count": 57, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "# cluster 4\n", | |
| "toronto_merged.loc[toronto_merged['Cluster_Labels'] == 3, toronto_merged.columns[[1] + list(range(5, toronto_merged.shape[1]))]]" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 58, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<div>\n", | |
| "<style scoped>\n", | |
| " .dataframe tbody tr th:only-of-type {\n", | |
| " vertical-align: middle;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe tbody tr th {\n", | |
| " vertical-align: top;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe thead th {\n", | |
| " text-align: right;\n", | |
| " }\n", | |
| "</style>\n", | |
| "<table border=\"1\" class=\"dataframe\">\n", | |
| " <thead>\n", | |
| " <tr style=\"text-align: right;\">\n", | |
| " <th></th>\n", | |
| " <th>Borough</th>\n", | |
| " <th>Cluster_Labels</th>\n", | |
| " <th>1st Most Common Venue</th>\n", | |
| " <th>2nd Most Common Venue</th>\n", | |
| " <th>3rd Most Common Venue</th>\n", | |
| " <th>4th Most Common Venue</th>\n", | |
| " <th>5th Most Common Venue</th>\n", | |
| " <th>6th Most Common Venue</th>\n", | |
| " <th>7th Most Common Venue</th>\n", | |
| " <th>8th Most Common Venue</th>\n", | |
| " <th>9th Most Common Venue</th>\n", | |
| " <th>10th Most Common Venue</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>0</th>\n", | |
| " <td>North York</td>\n", | |
| " <td>4</td>\n", | |
| " <td>Fast Food Restaurant</td>\n", | |
| " <td>Park</td>\n", | |
| " <td>Food & Drink Shop</td>\n", | |
| " <td>Eastern European Restaurant</td>\n", | |
| " <td>Discount Store</td>\n", | |
| " <td>Dog Run</td>\n", | |
| " <td>Doner Restaurant</td>\n", | |
| " <td>Donut Shop</td>\n", | |
| " <td>Drugstore</td>\n", | |
| " <td>Dumpling Restaurant</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>10</th>\n", | |
| " <td>North York</td>\n", | |
| " <td>4</td>\n", | |
| " <td>Japanese Restaurant</td>\n", | |
| " <td>Pizza Place</td>\n", | |
| " <td>Park</td>\n", | |
| " <td>Pub</td>\n", | |
| " <td>Dumpling Restaurant</td>\n", | |
| " <td>Diner</td>\n", | |
| " <td>Discount Store</td>\n", | |
| " <td>Dog Run</td>\n", | |
| " <td>Doner Restaurant</td>\n", | |
| " <td>Donut Shop</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>21</th>\n", | |
| " <td>York</td>\n", | |
| " <td>4</td>\n", | |
| " <td>Park</td>\n", | |
| " <td>Pharmacy</td>\n", | |
| " <td>Women's Store</td>\n", | |
| " <td>Market</td>\n", | |
| " <td>Fast Food Restaurant</td>\n", | |
| " <td>Dumpling Restaurant</td>\n", | |
| " <td>Discount Store</td>\n", | |
| " <td>Dog Run</td>\n", | |
| " <td>Doner Restaurant</td>\n", | |
| " <td>Donut Shop</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>40</th>\n", | |
| " <td>North York</td>\n", | |
| " <td>4</td>\n", | |
| " <td>Park</td>\n", | |
| " <td>Airport</td>\n", | |
| " <td>Bus Stop</td>\n", | |
| " <td>Yoga Studio</td>\n", | |
| " <td>Eastern European Restaurant</td>\n", | |
| " <td>Dog Run</td>\n", | |
| " <td>Doner Restaurant</td>\n", | |
| " <td>Donut Shop</td>\n", | |
| " <td>Drugstore</td>\n", | |
| " <td>Dumpling Restaurant</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>46</th>\n", | |
| " <td>North York</td>\n", | |
| " <td>4</td>\n", | |
| " <td>Park</td>\n", | |
| " <td>Grocery Store</td>\n", | |
| " <td>Bank</td>\n", | |
| " <td>Shopping Mall</td>\n", | |
| " <td>Yoga Studio</td>\n", | |
| " <td>Dumpling Restaurant</td>\n", | |
| " <td>Discount Store</td>\n", | |
| " <td>Dog Run</td>\n", | |
| " <td>Doner Restaurant</td>\n", | |
| " <td>Donut Shop</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>49</th>\n", | |
| " <td>North York</td>\n", | |
| " <td>4</td>\n", | |
| " <td>Park</td>\n", | |
| " <td>Construction & Landscaping</td>\n", | |
| " <td>Bakery</td>\n", | |
| " <td>Basketball Court</td>\n", | |
| " <td>Yoga Studio</td>\n", | |
| " <td>Electronics Store</td>\n", | |
| " <td>Doner Restaurant</td>\n", | |
| " <td>Donut Shop</td>\n", | |
| " <td>Drugstore</td>\n", | |
| " <td>Dumpling Restaurant</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>61</th>\n", | |
| " <td>Central Toronto</td>\n", | |
| " <td>4</td>\n", | |
| " <td>Park</td>\n", | |
| " <td>Bus Line</td>\n", | |
| " <td>Swim School</td>\n", | |
| " <td>Yoga Studio</td>\n", | |
| " <td>Dumpling Restaurant</td>\n", | |
| " <td>Dog Run</td>\n", | |
| " <td>Doner Restaurant</td>\n", | |
| " <td>Donut Shop</td>\n", | |
| " <td>Drugstore</td>\n", | |
| " <td>Eastern European Restaurant</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>68</th>\n", | |
| " <td>Central Toronto</td>\n", | |
| " <td>4</td>\n", | |
| " <td>Park</td>\n", | |
| " <td>Jewelry Store</td>\n", | |
| " <td>Sushi Restaurant</td>\n", | |
| " <td>Trail</td>\n", | |
| " <td>Yoga Studio</td>\n", | |
| " <td>Dumpling Restaurant</td>\n", | |
| " <td>Dog Run</td>\n", | |
| " <td>Doner Restaurant</td>\n", | |
| " <td>Donut Shop</td>\n", | |
| " <td>Drugstore</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>77</th>\n", | |
| " <td>Etobicoke</td>\n", | |
| " <td>4</td>\n", | |
| " <td>Pizza Place</td>\n", | |
| " <td>Park</td>\n", | |
| " <td>Mobile Phone Shop</td>\n", | |
| " <td>Drugstore</td>\n", | |
| " <td>Diner</td>\n", | |
| " <td>Discount Store</td>\n", | |
| " <td>Dog Run</td>\n", | |
| " <td>Doner Restaurant</td>\n", | |
| " <td>Donut Shop</td>\n", | |
| " <td>Dumpling Restaurant</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>98</th>\n", | |
| " <td>Etobicoke</td>\n", | |
| " <td>4</td>\n", | |
| " <td>Park</td>\n", | |
| " <td>River</td>\n", | |
| " <td>Smoke Shop</td>\n", | |
| " <td>Pool</td>\n", | |
| " <td>Yoga Studio</td>\n", | |
| " <td>Drugstore</td>\n", | |
| " <td>Diner</td>\n", | |
| " <td>Discount Store</td>\n", | |
| " <td>Dog Run</td>\n", | |
| " <td>Doner Restaurant</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " Borough Cluster_Labels 1st Most Common Venue \\\n", | |
| "0 North York 4 Fast Food Restaurant \n", | |
| "10 North York 4 Japanese Restaurant \n", | |
| "21 York 4 Park \n", | |
| "40 North York 4 Park \n", | |
| "46 North York 4 Park \n", | |
| "49 North York 4 Park \n", | |
| "61 Central Toronto 4 Park \n", | |
| "68 Central Toronto 4 Park \n", | |
| "77 Etobicoke 4 Pizza Place \n", | |
| "98 Etobicoke 4 Park \n", | |
| "\n", | |
| " 2nd Most Common Venue 3rd Most Common Venue \\\n", | |
| "0 Park Food & Drink Shop \n", | |
| "10 Pizza Place Park \n", | |
| "21 Pharmacy Women's Store \n", | |
| "40 Airport Bus Stop \n", | |
| "46 Grocery Store Bank \n", | |
| "49 Construction & Landscaping Bakery \n", | |
| "61 Bus Line Swim School \n", | |
| "68 Jewelry Store Sushi Restaurant \n", | |
| "77 Park Mobile Phone Shop \n", | |
| "98 River Smoke Shop \n", | |
| "\n", | |
| " 4th Most Common Venue 5th Most Common Venue \\\n", | |
| "0 Eastern European Restaurant Discount Store \n", | |
| "10 Pub Dumpling Restaurant \n", | |
| "21 Market Fast Food Restaurant \n", | |
| "40 Yoga Studio Eastern European Restaurant \n", | |
| "46 Shopping Mall Yoga Studio \n", | |
| "49 Basketball Court Yoga Studio \n", | |
| "61 Yoga Studio Dumpling Restaurant \n", | |
| "68 Trail Yoga Studio \n", | |
| "77 Drugstore Diner \n", | |
| "98 Pool Yoga Studio \n", | |
| "\n", | |
| " 6th Most Common Venue 7th Most Common Venue 8th Most Common Venue \\\n", | |
| "0 Dog Run Doner Restaurant Donut Shop \n", | |
| "10 Diner Discount Store Dog Run \n", | |
| "21 Dumpling Restaurant Discount Store Dog Run \n", | |
| "40 Dog Run Doner Restaurant Donut Shop \n", | |
| "46 Dumpling Restaurant Discount Store Dog Run \n", | |
| "49 Electronics Store Doner Restaurant Donut Shop \n", | |
| "61 Dog Run Doner Restaurant Donut Shop \n", | |
| "68 Dumpling Restaurant Dog Run Doner Restaurant \n", | |
| "77 Discount Store Dog Run Doner Restaurant \n", | |
| "98 Drugstore Diner Discount Store \n", | |
| "\n", | |
| " 9th Most Common Venue 10th Most Common Venue \n", | |
| "0 Drugstore Dumpling Restaurant \n", | |
| "10 Doner Restaurant Donut Shop \n", | |
| "21 Doner Restaurant Donut Shop \n", | |
| "40 Drugstore Dumpling Restaurant \n", | |
| "46 Doner Restaurant Donut Shop \n", | |
| "49 Drugstore Dumpling Restaurant \n", | |
| "61 Drugstore Eastern European Restaurant \n", | |
| "68 Donut Shop Drugstore \n", | |
| "77 Donut Shop Dumpling Restaurant \n", | |
| "98 Dog Run Doner Restaurant " | |
| ] | |
| }, | |
| "execution_count": 58, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "# Cluster 5\n", | |
| "toronto_merged.loc[toronto_merged['Cluster_Labels'] == 4, toronto_merged.columns[[1] + list(range(5, toronto_merged.shape[1]))]]" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "## Thank you for grading my lab" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [] | |
| } | |
| ], | |
| "metadata": { | |
| "kernelspec": { | |
| "display_name": "Python 3", | |
| "language": "python", | |
| "name": "python3" | |
| }, | |
| "language_info": { | |
| "codemirror_mode": { | |
| "name": "ipython", | |
| "version": 3 | |
| }, | |
| "file_extension": ".py", | |
| "mimetype": "text/x-python", | |
| "name": "python", | |
| "nbconvert_exporter": "python", | |
| "pygments_lexer": "ipython3", | |
| "version": "3.6.8" | |
| } | |
| }, | |
| "nbformat": 4, | |
| "nbformat_minor": 2 | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment