Загрузка данных


Windows PowerShell 5.1
(C) Корпорация Майкрософт (Microsoft Corporation). Все права защищены.

PS C:\Users\str> $root = 'C:\Temp\pepper42-build\wgt-staging'
PS C:\Users\str> $js = Join-Path $root 'static\js'
PS C:\Users\str>
PS C:\Users\str> function Show-Range {
>>     param([string]$File, [int]$Start, [int]$Count)
>>     $lines = Get-Content -LiteralPath $File
>>     $end = [Math]::Min($Start + $Count - 1, $lines.Length)
>>     for ($i = $Start; $i -le $end; $i++) {
>>         '{0,4}: {1}' -f $i, $lines[$i - 1]
>>     }
>> }
PS C:\Users\str>
PS C:\Users\str> Write-Host "`n===== NAVIGATION.START: ПЕРВЫЙ ВЫЗОВ ====="

===== NAVIGATION.START: ПЕРВЫЙ ВЫЗОВ =====
PS C:\Users\str> Show-Range (Join-Path $js 'index.js') 535 75
 535:       var img = new Image();
 536:       host.getBoxArt(app.id).then(function (resolvedPromise) {
 537:         img.src = resolvedPromise;
 538:       }, function (failedPromise) {
 539:         console.log('%c[index.js, showApps]', 'color: green;', 'Error! Failed to retrieve box art for app ID: ' + app.id + '. Returned value was: ' + failedPromise, '\n Host object:', host, host.toString());
 540:         img.src = 'static/res/placeholder_error.svg';
 541:       });
 542:       img.onload = function (e) {
 543:         return img.classList.add('fade-in');
 544:       };
 545:       $(gameCard).append(img);
 546:     });
 547:   }, function (failedAppList) {
 548:     $('#naclSpinner').hide();
 549:     var img = new Image();
 550:     img.src = 'static/res/applist_error.svg';
 551:     $("#game-grid").html(img);
 552:     snackbarLog('Unable to retrieve your games');
 553:     console.error('%c[index.js, showApps]', 'Failed to get applist from host: ' + host.hostname, '\n Host object:', host, host.toString());
 554:   });
 555:   showAppsMode();
 556: }
 557:
 558: // set the layout to the initial mode you see when you open moonlight
 559: function showHostsAndSettingsMode() {
 560:   console.log('%c[index.js]', 'color: green;', 'Entering "Show apps and hosts" mode');
 561:   $("#main-navigation").show();
 562:   $(".nav-menu-parent").show();
 563:   $("#externalAudioBtn").show();
 564:   $("#mouseLockBtn").show();
 565:   $("#main-content").children().not("#listener, #loadingSpinner, #naclSpinner").show();
 566:   $('#game-grid').hide();
 567:   $('#backIcon').hide();
 568:   $('#quitCurrentApp').hide();
 569:   $("#main-content").removeClass("fullscreen");
 570:   $("#listener").removeClass("fullscreen");
 571:   Navigation.start();
 572:   Navigation.pop();
 573:   startPollingHosts();
 574: }
 575: function showAppsMode() {
 576:   console.log('%c[index.js]', 'color: green;', 'Entering "Show apps" mode');
 577:   $('#backIcon').show();
 578:   $("#main-navigation").show();
 579:   $("#main-content").children().not("#listener, #loadingSpinner, #naclSpinner").show();
 580:   $("#streamSettings").hide();
 581:   $(".nav-menu-parent").hide();
 582:   $("#externalAudioBtn").hide();
 583:   $("#mouseLockBtn").hide();
 584:   $("#host-grid").hide();
 585:   $("#settings").hide();
 586:   $("#main-content").removeClass("fullscreen");
 587:   $("#listener").removeClass("fullscreen");
 588:   $('#loadingSpinner').css('display', 'none');
 589:   $('body').css('backgroundColor', '#282C38');
 590:   isInGame = false;
 591:
 592:   // FIXME: We want to eventually poll on the app screen but we can't now
 593:   // because it slows down box art loading and we don't update the UI live
 594:   // anyway.
 595:   stopPollingHosts();
 596:   Navigation.start();
 597: }
 598:
 599: // start the given appID.  if another app is running, offer to quit it.
 600: // if the given app is already running, just resume it.
 601: function startGame(host, appID) {
 602:   if (!host || !host.paired) {
 603:     console.error('%c[index.js, startGame]', 'color: green;', 'Attempted to start a game, but `host` did not initialize properly. Host object: ', host);
 604:     return;
 605:   }
 606:
 607:   // refresh the server info, because the user might have quit the game.
 608:   host.refreshServerInfo().then(function (ret) {
 609:     host.getAppById(appID).then(function (appToStart) {
PS C:\Users\str>
PS C:\Users\str> Write-Host "`n===== NAVIGATION.START: ВТОРОЙ ВЫЗОВ ====="

===== NAVIGATION.START: ВТОРОЙ ВЫЗОВ =====
PS C:\Users\str> Show-Range (Join-Path $js 'index.js') 580 45
 580:   $("#streamSettings").hide();
 581:   $(".nav-menu-parent").hide();
 582:   $("#externalAudioBtn").hide();
 583:   $("#mouseLockBtn").hide();
 584:   $("#host-grid").hide();
 585:   $("#settings").hide();
 586:   $("#main-content").removeClass("fullscreen");
 587:   $("#listener").removeClass("fullscreen");
 588:   $('#loadingSpinner').css('display', 'none');
 589:   $('body').css('backgroundColor', '#282C38');
 590:   isInGame = false;
 591:
 592:   // FIXME: We want to eventually poll on the app screen but we can't now
 593:   // because it slows down box art loading and we don't update the UI live
 594:   // anyway.
 595:   stopPollingHosts();
 596:   Navigation.start();
 597: }
 598:
 599: // start the given appID.  if another app is running, offer to quit it.
 600: // if the given app is already running, just resume it.
 601: function startGame(host, appID) {
 602:   if (!host || !host.paired) {
 603:     console.error('%c[index.js, startGame]', 'color: green;', 'Attempted to start a game, but `host` did not initialize properly. Host object: ', host);
 604:     return;
 605:   }
 606:
 607:   // refresh the server info, because the user might have quit the game.
 608:   host.refreshServerInfo().then(function (ret) {
 609:     host.getAppById(appID).then(function (appToStart) {
 610:       if (host.currentGame != 0 && host.currentGame != appID) {
 611:         host.getAppById(host.currentGame).then(function (currentApp) {
 612:           var quitAppDialog = document.querySelector('#quitAppDialog');
 613:           document.getElementById('quitAppDialogText').innerHTML = currentApp.title + ' is already running. Would you like to quit ' + currentApp.title + '?';
 614:           quitAppDialog.showModal();
 615:           Navigation.push(Views.CloseAppDialog);
 616:           $('#cancelQuitApp').off('click');
 617:           $('#cancelQuitApp').on('click', function () {
 618:             quitAppDialog.close();
 619:             Navigation.pop();
 620:             console.log('[index.js, startGame]', 'color: green;', 'Closing app dialog, and returning');
 621:           });
 622:           $('#continueQuitApp').off('click');
 623:           $('#continueQuitApp').on('click', function () {
 624:             console.log('[index.js, startGame]', 'color: green;', 'Stopping game, and closing app dialog, and returning');
PS C:\Users\str>
PS C:\Users\str> Write-Host "`n===== ОСТАНОВКА NAVIGATION И ВОЗВРАТ ====="

===== ОСТАНОВКА NAVIGATION И ВОЗВРАТ =====
PS C:\Users\str> Show-Range (Join-Path $js 'index.js') 690 75
 690:           showApps(host);
 691:           return;
 692:         }
 693:         sendMessage('startRequest', [host.address, streamWidth, streamHeight, frameRate, bitrate.toString(), rikey, rikeyid.toString(), mouse_lock_enabled, host.appVersion, host.gfeVersion, $root.find('sessionUrl0').text().trim()]);
 694:       }, function (failedLaunchApp) {
 695:         console.error('%c[index.js, launchApp]', 'color: green;', 'Failed to launch app width id: ' + appID + '\nReturned error was: ' + failedLaunchApp);
 696:         showApps(host);
 697:         return;
 698:       });
 699:     });
 700:   });
 701: }
 702: function playGameMode() {
 703:   console.log('%c[index.js, playGameMode]', 'color:green;', 'Entering play game mode');
 704:   isInGame = true;
 705:   $("#main-navigation").hide();
 706:   $("#main-content").children().not("#listener, #loadingSpinner").hide();
 707:   $("#main-content").addClass("fullscreen");
 708:   $("#listener").addClass("fullscreen");
 709:
 710:   // Hide the NaCl module until the first frame is rendered
 711:   $("#nacl_module")[0].style.opacity = 0.0;
 712:   fullscreenNaclModule();
 713:   $('#loadingSpinner').css('display', 'inline-block');
 714:   Navigation.stop();
 715: }
 716:
 717: // Maximize the size of the nacl module by scaling and resizing appropriately
 718: function fullscreenNaclModule() {
 719:   var streamWidth = $('#selectResolution').data('value').split(':')[0];
 720:   var streamHeight = $('#selectResolution').data('value').split(':')[1];
 721:   var screenWidth = window.innerWidth;
 722:   var screenHeight = window.innerHeight;
 723:   var xRatio = screenWidth / streamWidth;
 724:   var yRatio = screenHeight / streamHeight;
 725:   var zoom = Math.min(xRatio, yRatio);
 726:   var module = $("#nacl_module")[0];
 727:   module.width = zoom * streamWidth;
 728:   module.height = zoom * streamHeight;
 729:   module.style.marginTop = (screenHeight - module.height) / 2 + "px";
 730: }
 731: function stopGameWithConfirmation() {
 732:   if (api.currentGame === 0) {
 733:     snackbarLog('Nothing was running');
 734:   } else {
 735:     api.getAppById(api.currentGame).then(function (currentGame) {
 736:       var quitAppDialog = document.querySelector('#quitAppDialog');
 737:       document.getElementById('quitAppDialogText').innerHTML = ' Are you sure you would like to quit ' + currentGame.title + '?  Unsaved progress will be lost.';
 738:       quitAppDialog.showModal();
 739:       Navigation.push(Views.CloseAppDialog);
 740:       $('#cancelQuitApp').off('click');
 741:       $('#cancelQuitApp').on('click', function () {
 742:         console.log('%c[index.js, stopGameWithConfirmation]', 'color:green;', 'Closing app dialog, and returning');
 743:         quitAppDialog.close();
 744:         Navigation.pop();
 745:       });
 746:       $('#continueQuitApp').off('click');
 747:       $('#continueQuitApp').on('click', function () {
 748:         console.log('%c[index.js, stopGameWithConfirmation]', 'color:green;', 'Stopping game, and closing app dialog, and returning');
 749:         stopGame(api);
 750:         quitAppDialog.close();
 751:         Navigation.pop();
 752:       });
 753:     });
 754:   }
 755: }
 756: function stopGame(host, callbackFunction) {
 757:   isInGame = false;
 758:   if (!host.paired) {
 759:     return;
 760:   }
 761:   host.refreshServerInfo().then(function (ret) {
 762:     host.getAppById(host.currentGame).then(function (runningApp) {
 763:       if (!runningApp) {
 764:         snackbarLog('Nothing was running');
PS C:\Users\str>
PS C:\Users\str> Write-Host "`n===== РЕГИСТРАЦИЯ КЛАВИШ TIZEN ====="

===== РЕГИСТРАЦИЯ КЛАВИШ TIZEN =====
PS C:\Users\str> Show-Range (Join-Path $js 'platform.js') 305 90
PS C:\Users\str>
PS C:\Users\str> Write-Host "`n===== ИНИЦИАЛИЗАЦИЯ ПУЛЬТА ====="

===== ИНИЦИАЛИЗАЦИЯ ПУЛЬТА =====
PS C:\Users\str> Select-String -Path (Join-Path $js 'index.js') -Pattern 'function initSamsungKeys|function remoteControllerHandler|platformOnLoad' -Context 0,35

> C:\Temp\pepper42-build\wgt-staging\static\js\index.js:992:function initSamsungKeys() {
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:993:  console.log('initializing keys');
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:994:  var handler = {
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:995:    initRemoteController: true,
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:996:    buttonsToRegister: [
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:997:    // https://developer.samsung.com/tv/develop/guides/user
-interaction/keyboardime
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:998:    'ColorF0Red',
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:999:    // F1
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1000:    'ColorF1Green',
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1001:    // F2
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1002:    'ColorF2Yellow',
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1003:    // F3
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1004:    'ColorF3Blue',
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1005:    // F4
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1006:    // Not working...
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1007:    //'SmartHub',      // F5
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1008:    'Source',
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1009:    // F6
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1010:    'ChannelList',
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1011:    // F7
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1012:    'ChannelDown',
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1013:    // F11
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1014:    'ChannelUp' // F12
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1015:    ],
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1016:    onKeydownListener: remoteControllerHandler
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1017:  };
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1018:  console.log('Initializing SamsungTV platform');
> C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1019:  platformOnLoad(handler);
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1020:}
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1021:function onWindowLoad() {
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1022:  console.log('%c[index.js]', 'color: green;', 'Moonlight\
's main window loaded');
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1023:  // don't show the game selection div
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1024:  $('#gameSelection').css('display', 'none');
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1025:  console.log('load stored resolution prefs');
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1026:  getData('resolution', function (previousValue) {
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1027:    if (previousValue.resolution != null) {
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1028:      $('.resolutionMenu li').each(function () {
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1029:        if ($(this).data('value') === previousValue.resolu
tion) {
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1030:          $('#selectResolution').text($(this).text()).data
('value', previousValue.resolution);
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1031:        }
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1032:      });
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1033:    }
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1034:  });
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1035:  console.log('Load stored remote audio prefs');
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1036:  getData('remoteAudio', function (previousValue) {
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1037:    if (previousValue.remoteAudio == null) {
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1038:      document.querySelector('#externalAudioBtn').Material
IconToggle.uncheck();
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1039:    } else if (previousValue.remoteAudio == false) {
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1040:      document.querySelector('#externalAudioBtn').Material
IconToggle.uncheck();
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1041:    } else {
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1042:      document.querySelector('#externalAudioBtn').Material
IconToggle.check();
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1043:    }
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1044:  });
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1045:  console.log('load stored framerate prefs');
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1046:  getData('frameRate', function (previousValue) {
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1047:    if (previousValue.frameRate != null) {
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1048:      $('.framerateMenu li').each(function () {
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1049:        if ($(this).data('value') === previousValue.frameR
ate) {
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1050:          $('#selectFramerate').text($(this).text()).data(
'value', previousValue.frameRate);
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1051:        }
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1052:      });
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1053:    }
  C:\Temp\pepper42-build\wgt-staging\static\js\index.js:1054:  });


PS C:\Users\str>
PS C:\Users\str> Write-Host "`n===== CSS: FLEX-БЛОК И АДАПТИВНЫЕ ПРАВИЛА ====="

===== CSS: FLEX-БЛОК И АДАПТИВНЫЕ ПРАВИЛА =====
PS C:\Users\str> Show-Range (Join-Path $root 'static\css\style.css') 20 75
  20: }
  21:
  22: .mdl-layout__header-row {
  23:     padding: 0 80px 0 80px;
  24: }
  25:
  26: main {
  27:     padding: 0 80px 0 80px;
  28: }
  29:
  30: @media screen and (max-width: 600px) {
  31:     #host-grid .mdl-card {
  32:         flex-basis: 50% !important;
  33:     }
  34:     #game-grid .mdl-card {
  35:         height: 100px !important;
  36:         width: 75px !important;
  37:     }
  38: }
  39:
  40: @media screen and (min-width: 600px) and (max-width: 800px) {
  41:     #host-grid .mdl-card {
  42:         flex-basis: 33% !important;
  43:     }
  44:     #game-grid .mdl-card {
  45:         height: 150px !important;
  46:         width: 112.5px !important;
  47:     }
  48: }
  49:
  50: @media screen and (min-width: 800px) and (max-width: 1024px) {
  51:     main {
  52:         padding: 0 72px 0 72px !important;
  53:     }
  54:     .mdl-layout__header-row {
  55:         padding: 0 72px 0 72px !important;
  56:     }
  57:     #host-grid .mdl-card {
  58:         flex-basis: 25% !important;
  59:     }
  60:     #game-grid .mdl-card {
  61:         height: 200px !important;
  62:         width: 150px !important;
  63:     }
  64: }
  65:
  66: @media screen and (min-width: 1024px) {
  67:     #game-grid .mdl-card {
  68:         height: 300px !important;
  69:         width: 225px !important;
  70:     }
  71: }
  72:
  73: .nav-menu-parent {
  74:     position: relative;
  75:     margin: 0 4px;
  76: }
  77: .mdl-menu__outline {
  78:     background-color: #333846;
  79:     color: white;
  80: }
  81: .mdl-menu__item {
  82:     color: white;
  83: }
  84: .mdl-menu__item:hover, .mdl-menu__item.hovered, .mdl-menu__item:focus {
  85:     background-color: #00A3C6;
  86: }
  87: #bitrateField {
  88:     width: 100px;
  89:     height: 36px;
  90:     overflow: hidden;
  91:     text-transform: none;
  92: }
  93: .bitrateMenu {
  94:     width: 170px;
PS C:\Users\str> Show-Range (Join-Path $root 'static\css\style.css') 165 95
 165:     min-width:0px;
 166: }
 167: #host-grid, #game-grid {
 168:     padding: 0;
 169:     margin: 0;
 170:     -webkit-flex: 1;
 171:     flex: 1;
 172:     display: -webkit-flex;
 173:     display: flex;
 174:     -webkit-flex-flow: row wrap;
 175:     flex-flow: row wrap;
 176:     -webkit-align-items: center;
 177:     align-items: center;
 178:     -webkit-justify-content: center;
 179:     justify-content: center;
 180: }
 181: #host-grid .mdl-card {
 182:     flex-basis: 15%;
 183: }
 184: #game-grid .mdl-card {
 185:     position: relative;
 186:     background: url('../res/placeholder_game.svg') rgba(29, 29, 29, 1) center/cover no-repeat;
 187: }
 188: #host-grid .mdl-card, #game-grid .mdl-card {
 189:     text-align: center;
 190:     width: 170px;
 191:     height: 170px;
 192:     min-height: 170px;
 193:     margin: 15px;
 194:     cursor: pointer;
 195:     transition: all .2s ease-in-out;
 196:     will-change: transform;
 197: }
 198: #host-grid .mdl-card:hover, #host-grid .mdl-card:focus, #host-grid .mdl-card:active, #game-grid .mdl-card:focus, #game-grid .mdl-card:active {
 199:     transform: scale(1.15);
 200:     outline : #00A3C6 solid 2px;;
 201: }
 202: #host-grid .mdl-card__title {
 203:     padding: 0;
 204: }
 205: #host-grid .mdl-card__title .mdl-card__title-text {
 206:     width: 100%;
 207:     font-size: 14px;
 208:     padding: 10px 15px;
 209:     background-color: rgba(0,0,0,0.7);
 210: }
 211: #game-grid .mdl-card img {
 212:     height: 100%;
 213:     width: 100%;
 214:     opacity: 0;
 215:     transition: opacity .3s;
 216:     z-index: -1;
 217: }
 218: #game-grid .mdl-card img.fade-in {
 219:     opacity: 1;
 220: }
 221: #game-grid .game-title {
 222:     position: absolute;
 223:     bottom: 0;
 224:     min-height: 20px;
 225:     font-size: 13px;
 226:     font-weight: 300;
 227:     padding: 5px 0;
 228:     width: 100%;
 229:     color: white;
 230:     text-align: center;
 231:     background-color: rgba(0, 0, 0, 0.6);
 232: }
 233: #game-grid .game-title span {
 234:     padding: 0 10px;
 235: }
 236: .add-host-card > .mdl-card__title {
 237:     color: #fff;
 238:     background:
 239:             url('../res/ic_add_to_queue_white_48px.svg') center no-repeat #3E4454;
 240: }
 241: .host-container > .mdl-card__title {
 242:     color: #fff;
 243:     background:
 244:             url('../res/ic_tv_white_48px.svg') center no-repeat #3E4454;
 245: }
 246: .mdl-card.hovered {
 247:     background-color: initial;
 248:     outline: #00A3C6 solid 2px;
 249:     transform: scale(1.15);
 250: }
 251: #host-grid p {
 252:     margin: 0;
 253: }
 254: #host-grid .mdl-textfield {
 255:     width: 200px;
 256:     margin-right: 20px;
 257:     margin-bottom: 0px;
 258: }
 259: #host-grid #GFEHostIPField {
PS C:\Users\str>
PS C:\Users\str> Write-Host "`n===== HTML: VIEWPORT И ПОДКЛЮЧЕНИЕ СТИЛЕЙ ====="

===== HTML: VIEWPORT И ПОДКЛЮЧЕНИЕ СТИЛЕЙ =====
PS C:\Users\str> Show-Range (Join-Path $root 'index.html') 1 45
   1: <!DOCTYPE html>
   2: <html>
   3: <head>
   4:   <meta http-equiv="Pragma" content="no-cache">
   5:   <meta http-equiv="Expires" content="-1">
   6:   <meta name="viewport" content="width=device-width, initial-scale=1.0">
   7:   <title>Moonlight</title>
   8:   <link rel="stylesheet" href="static/css/roboto.css">
   9:   <link rel="stylesheet" href="static/css/material.min.css">
  10:   <link rel="stylesheet" href="static/css/style.css">
  11:   <link rel="stylesheet" href="static/css/material-icons.css">
  12:   <script type="text/javascript" src="static/js/platform.js"></script>
  13: </head>
  14: <body data-name="moonlight-chrome" data-tools="pnacl" data-configs="Debug Release" data-path="{tc}/{config}">
  15: <div id="eventAnchor" tabindex="0" style="position:absolute;left:0;top:0;width:1px;height:1px;opacity:0;"></div>
  16:   <div class="mdl-layout mdl-js-layout">
  17:     <header id="main-navigation" class="mdl-layout__header mdl-layout__header--transparent">
  18:       <div class="mdl-layout__header-row">
  19:         <button id="backIcon" class="mdl-button mdl-js-button mdl-button--icon" role="link" aria-label="Host selection"><i class="material-icons">keyboard_arrow_left</i></button>
  20:         <!-- Title -->
  21:         <span class="mdl-layout-title">MOON<span>LIGHT</span></span>
  22:         <!-- Add spacer, to align navigation to the right -->
  23:         <div class="mdl-layout-spacer"></div>
  24:         <!-- Navigation -->
  25:         <nav class="mdl-navigation">
  26:           <div class="nav-menu-parent">
  27:             <div id="resolutionMenu">
  28:               <button id="selectResolution" data-value="1280:720" class="mdl-button mdl-js-button">
  29:                                 720p
  30:                             </button>
  31:             </div>
  32:
  33:             <ul class="resolutionMenu mdl-menu mdl-menu--bottom-right mdl-js-menu mdl-js-ripple-effect" for="selectResolution">
  34:               <li class="mdl-menu__item" data-value="858:480">480p</li>
  35:               <li class="mdl-menu__item" data-value="1280:720">720p</li>
  36:               <li class="mdl-menu__item" data-value="1920:1080">1080p</li>
  37:               <li class="mdl-menu__item" data-value="2560:1440">1440p</li>
  38:               <li class="mdl-menu__item" data-value="3840:2160">4K</li>
  39:             </ul>
  40:
  41:             <div id="resolutionTooltip" class="mdl-tooltip" for="resolutionMenu">
  42:               Resolution
  43:             </div>
  44:           </div>
  45:           <div class="nav-menu-parent">
PS C:\Users\str>