Cmake: для чего нужен find_package(), если вам все равно нужно указать cmake_module_path?

Search Modes¶

The command has two very distinct ways of conducting the search:

Module mode

In this mode, CMake searches for a file called ,
looking first in the locations listed in the ,
then among the provided by the CMake installation.
If the file is found, it is read and processed by CMake. It is responsible
for finding the package, checking the version, and producing any needed
messages. Some Find modules provide limited or no support for versioning;
check the Find module’s documentation.

The file is not typically provided by the
package itself. Rather, it is normally provided by something external to
the package, such as the operating system, CMake itself, or even the project
from which the command was called. Being externally
provided, tend to be heuristic in nature and are
susceptible to becoming out-of-date. They typically search for certain
libraries, files and other package artifacts.

Module mode is only supported by the
.

Config mode

In this mode, CMake searches for a file called
or .
It will also look for or
if version details were specified
(see for an explanation of how these separate
version files are used).

In config mode, the command can be given a list of names to search for
as package names. The locations where CMake searches for the config and
version files is considerably more complicated than for Module mode
(see ).

The config and version files are typically installed as part of the
package, so they tend to be more reliable than Find modules. They usually
contain direct knowledge of the package contents, so no searching or
heuristics are needed within the config or version files themselves.

Config mode is supported by both the and
command signatures.

The command arguments determine which of the above modes is used. When the
is used, the command searches in Module mode first.
If the package is not found, the search falls back to Config mode.
A user may set the variable
to true to reverse the priority and direct CMake to search using Config mode
first before falling back to Module mode. The basic signature can also be
forced to use only Module mode with a keyword. If the
is used, the command only searches in Config mode.

Удаление пакета

См. подробнее об Uninstall-Package. Если необходимо найти идентификатор, чтобы просмотреть все пакеты, установленные в проекте по умолчанию, используйте команду Get-Package.

При удалении пакета выполняются следующие действия:

  • Удаляются ссылки на пакет из проекта (и любого используемого формата управления). Ссылки больше не отображаются в обозревателе решений (возможно, потребуется перестроить проект, чтобы он был удален из папки Bin).
  • Отменяются все изменения, внесенные в или при установке пакета.
  • Удаляются ранее установленные зависимости, если остальные пакеты не используют эти зависимости.

ModuleNotFoundError: No module named ‘requests’

Эта ошибка обычно вызвана тем, что модуль requests
не установлен, либо установлен, но не для того python, который Вы запустили.

Например, для python2.6 установлен, а для python3 не установлен.

Можно попробовать установить модуль requests. Подробнее про это
я писал в статье Тестирование с помощью Python.
Потому что столкнулся с этой проблемой впервые именно при
тестировании
API
Если эта проблема возникла при использовании PyCharm
установите requests для Вашего проекта по следующей

инструкции

Перейдите в настройки проекта нажав

File — Settings

Выберите раздел Project Interpreter

Project Interpreter

Нажмите на плюс в правой части экрана

Введите в стоку поиска название нужного модуля. В моём случае это requests

Введите в поиске requests

Должно открыться окно Available Packages

Нажмите кнопку Install Package

Нажмите Install

Дождитесь окончания установки

Дождитесь окончания установки

Решение 2. Сбросьте NVRAM до значений по умолчанию

NVRAM отвечает за многие процессы во время запуска вашей системы. Вы можете столкнуться с обсуждаемой ошибкой, если NVRAM вашей системы поврежден. В этом случае сброс NVRAM к значениям по умолчанию может решить проблему. Этот метод может применяться не ко всем пользователям.

  1. Включите Mac и закройте все приложения.
  2. Теперь запустите Finder и откройте Утилиты.Открытие терминала
  3. Теперь откройте Терминал и введите следующую команду: sudo nvram -c
  4. Теперь нажмите клавишу Enter и введите свой пароль.
  5. Затем введите в Терминал следующее: sudo shutdown -r nowСброс NVRAM Mac через терминал
  6. Теперь нажмите клавишу Enter, и система перезагрузится.
  7. Подождите, пока система включится, а затем выключите ее.
  8. Теперь включите систему и проверьте, решена ли проблема.

Full Signature and Config Mode¶

User code should generally look for packages using the above . The remainder of this command documentation specifies the
full command signature and details of the search process. Project
maintainers wishing to provide a package to be found by this command
are encouraged to read on.

The complete Config mode command signature is

find_package(<PackageName>versionEXACTQUIET
REQUIRED]
OPTIONAL_COMPONENTScomponents...
CONFIG|NO_MODULE
NO_POLICY_SCOPE
NAMESname1name2...]]
CONFIGSconfig1config2...]]
HINTSpath1path2...]]
PATHSpath1path2...]]
PATH_SUFFIXESsuffix1suffix2...]]
NO_DEFAULT_PATH
NO_PACKAGE_ROOT_PATH
NO_CMAKE_PATH
NO_CMAKE_ENVIRONMENT_PATH
NO_SYSTEM_ENVIRONMENT_PATH
NO_CMAKE_PACKAGE_REGISTRY
NO_CMAKE_BUILDS_PATH# Deprecated; does nothing.
NO_CMAKE_SYSTEM_PATH
NO_CMAKE_SYSTEM_PACKAGE_REGISTRY
CMAKE_FIND_ROOT_PATH_BOTH|
ONLY_CMAKE_FIND_ROOT_PATH|
NO_CMAKE_FIND_ROOT_PATH)

The option, the synonymous option, or the use
of options not specified in the all enforce pure Config
mode. In pure Config mode, the command skips Module mode search and
proceeds at once with Config mode search.

Config mode search attempts to locate a configuration file provided by the
package to be found. A cache entry called is created to
hold the directory containing the file. By default the command
searches for a package with the name . If the option
is given the names following it are used instead of .
The command searches for a file called or
for each name specified.
A replacement set of possible configuration file names may be given
using the option. The search procedure is specified below.
Once found, the configuration file is read and processed by CMake.
Since the file is provided by the package it already knows the
location of package contents. The full path to the configuration file
is stored in the cmake variable .

All configuration files which have been considered by CMake while
searching for an installation of the package with an appropriate
version are stored in the cmake variable ,
the associated versions in .

If the package configuration file cannot be found CMake will generate
an error describing the problem unless the argument is
specified. If is specified and the package is not found a
fatal error is generated and the configure step stops executing. If
has been set to a directory not containing a
configuration file CMake will ignore it and search from scratch.

Basic Signature and Module Mode¶

find_package(<PackageName>versionEXACTQUIETMODULE
REQUIRED]
OPTIONAL_COMPONENTScomponents...
NO_POLICY_SCOPE)

Finds and loads settings from an external project.
will be set to indicate whether the package was found. When the
package is found package-specific information is provided through
variables and documented by the package itself. The
option disables informational messages, including those indicating
that the package cannot be found if it is not . The
option stops processing with an error message if the package cannot be found.

A package-specific list of required components may be listed after the
option (or after the option if present).
Additional optional components may be listed after
. Available components and their influence on
whether a package is considered to be found are defined by the target
package.

The argument requests a version with which the package found
should be compatible (format is ). The
option requests that the version be matched exactly. If no
and/or component list is given to a recursive invocation
inside a find-module, the corresponding arguments are forwarded
automatically from the outer call (including the flag for
). Version support is currently provided only on a
package-by-package basis (see the section below).

See the command documentation for discussion
of the option.

The command has two modes by which it searches for packages: “Module”
mode and “Config” mode. The above signature selects Module mode.
If no module is found the command falls back to Config mode, described
below. This fall back is disabled if the option is given.

In Module mode, CMake searches for a file called .
The file is first searched in the ,
then among the provided by the CMake installation.
If the file is found, it is read and processed by CMake. It is responsible
for finding the package, checking the version, and producing any needed
messages. Some find-modules provide limited or no support for versioning;
check the module documentation.

Хранилище

Под капотом используется Vuex.

Команда разработчиков nuxt и тут решила упростить нам жизнь, написав дополнительную надстройку для Vuex, которая помогает писать меньше кода, а значит и меньше багов.

Чтобы добавить модуль в nuxt хранилище, достаточно в папке store создать новый файл, в котором надо расписать переменные, экшены, мутации и геттеры. Название этого файла будет названием модуля, которое будем вызывать в коде, чтобы получать нужные данные.

Ниже покажу пример модуля, где запрашивается список продуктов по API:

// products.jsexport const state = () => ({  loaded: false,  list: []})export const mutations = {  SET_DATA(state, data) {    state.list = data  },  SET_LOADED_STATUS(state, status) {    state.loaded = status  }}export const actions = {  async getProducts({ commit }) {    try {      const products = API.GetProducts() // делаем запрос к api      commit('SET_DATA', products)      commit('SET_LOADED_STATUS', true)    } catch (err) {      if (err) throw err    }  }}export const getters = {  products(state) {    return state.list  }}

И где-нибудь в коде пытаемся получить эти данные:

// Home.vue<template>  <div>    ` productsList `  </div></template><script>import { mapState, mapActions } from 'vuex'export default {  name: 'Home',  computed: {    ...mapState('products', {      productsList: 'list',    }),  },  created() {    this.getProducts()  },  methods: {    ...mapActions('categories', ),  }}</script>

Совет №6: используйте функции

В CMake можно объявлять свои функциональные макросы и свои функции. Есть лишь одно различие между ними: переменные, установленные внутри функции, являются локальными.

Удобно писать функции, чтобы решать текущие проблемы кастомизации сборки либо упрощать добавление множества целей сборки. Пример ниже был написан для более корректного включения C++17 из-за того, что

  • CMake 3.8 ещё не умеет передавать Visual Studio флаг для включения C++17
  • при использовании в Clang/libc++ нужно указать компоновщику, что проект надо линковать с , поскольку в модуля filesystem пока ещё нет; также нужно линковать с pthread, поскольку реализация thread/mutex и т.п. опирается на pthread

Каждая функция — это по сути хак, созданный для переопределения языка CMake или его поведения. Для других разработчиков смысл этого хака неясен. Поэтому старайтесь к каждой инструкции в функции добавлять комментарий, объясняющий её цель и смысл.

Часто встречающиеся ошибки 1С и общие способы их решения Промо

Статья рассчитана в первую очередь на тех, кто недостаточно много работал с 1С и не успел набить шишек при встрече с часто встречающимися ошибками. Обычно можно определить для себя несколько действий благодаря которым можно определить решится ли проблема за несколько минут или же потребует дополнительного анализа. В первое время сталкиваясь с простыми ошибками тратил уйму времени на то, чтобы с ними разобраться. Конечно, интернет сильно помогает в таких вопросах, но не всегда есть возможность им воспользоваться. Поэтому надеюсь, что эта статья поможет кому-нибудь сэкономить время.

Заставьте все приложения работать в режиме мультиоконности

В Android 7.0 появился собственный многооконный режим, но не все приложения поддерживают его. На самом деле, его не поддерживают многие приложения, что делает его не очень полезным, но на этот случай есть способ принудительной совместимости с новой функцией, и все, что вам нужно сделать, это вернуться к параметрам разработчика.

  1. Выполните действия, описанные выше, чтобы включить параметры разработчика
  2. Перейдите в параметры разработчика
  3. Прокрутите вниз и активируйте параметр «Изменение размера в многооконном режиме»
  4. Перезагрузите телефон

Теперь вы сможете открывать любые приложения в многооконном режиме. Следует отметить, что некоторые приложения могут принудительно закрываться, когда вы переводите их в многооконный режим. В приложениях, которые его не поддерживают, будет указано «Это приложение может не работать в многооконном режиме», но большинство из них по-прежнему работают просто отлично.

Поиск и установка пакета

Для поиска и установки пакета необходимо выполнить три простых шага:

  1. откройте проект или решение в Visual Studio и откройте консоль с помощью команды сервис NuGet диспетчер пакетов > диспетчер пакетов консоли .

  2. Найдите пакет, который требуется установить. Если вы уже знакомы с этим процессом, перейдите к шагу 3.

  3. Выполните команду установки:

Важно!

Все операции, доступные в консоли, также можно выполнить с помощью CLI NuGet. Но команды консоли работают в контексте Visual Studio и сохраненного проекта или решения, и область их применения часто шире, чем у их эквивалентов в CLI. Например, при установке пакета с помощью консоли добавляется ссылка на проект, а при использовании команды CLI этого не происходит. По этой причине разработчики, работающие в Visual Studio, обычно предпочитают использовать консоль вместо CLI.

Совет

Многие операции консоли зависят от наличия решения, открытого в Visual Studio с использованием известного имени пути. Если у вас нет решения или оно не сохранено, отобразится сообщение об ошибке «Решение не открыто или не сохранено. Убедитесь, что у вас есть открытое и сохраненное решение «. Это означает, что консоль не может определить папку решения. Эту ошибку можно исправить, сохранив несохраненное решение или создав и сохранив решение, если оно не открыто.

Режим полной подписи и настройки

Пользовательский код должен обычно искать пакеты, используя вышеуказанную . В оставшейся части документации по этой команде указывается полная подпись команды и подробности процесса поиска. Сопровождающим проекта, желающим предоставить пакет, который будет найден этой командой, рекомендуется читать дальше.

Полная сигнатура команды режима Config

find_package(<PackageName>   
               ]
             
             
             
             ]
             ]
             ]
             ]
             ]
             
             
             
             
             
             
              # Deprecated; does nothing.
             
             
             )

Опция , синонимичная опция или использование опций, не указанных в все обеспечивают режим чистой конфигурации. В режиме чистого конфигурирования команда пропускает поиск в режиме модуля и сразу переходит к поиску в режиме конфигурации.

Поиск в режиме конфигурации пытается найти файл конфигурации, предоставляемый пакетом для поиска. Запись кэша с именем создается для хранения каталога, содержащего файл. По умолчанию команда выполняет поиск пакета с именем . Если указан параметр , вместо используются следующие имена . Команда выполняет поиск файла с именем или для каждого указанного имени. Набор замены возможных имен файлов конфигурации может быть дан с использованием вариант. Процедура поиска указана ниже. Найденный файл конфигурации читается и обрабатывается CMake. Поскольку файл предоставляется пакетом, он уже знает местоположение содержимого пакета. Полный путь к файлу конфигурации хранится в переменной cmake .

Все файлы конфигурации, которые были рассмотрены CMake при поиске установки пакета с соответствующей версией, хранятся в переменной cmake , связанные версии в .

Если файл конфигурации пакета не найден, CMake выдаст ошибку, описывающую проблему, если не указан аргумент . Если указано , а пакет не найден, генерируется фатальная ошибка и этап конфигурирования прекращается. Если для задан каталог, не содержащий файл конфигурации, CMake проигнорирует его и выполнит поиск с нуля.

Разработчикам пакетов, предоставляющим файлы конфигурации пакета CMake, рекомендуется присвоить им имена и установить их так, чтобы описанная ниже нашла их без необходимости использования дополнительных опций.

Решение 1. Переключитесь на проводную клавиатуру

Пользователи Mac обычно используют Bluetooth или беспроводную клавиатуру с macOS. Но иногда индикатор беспроводной / Bluetooth-клавиатуры загорается очень поздно во время процесса загрузки, и поэтому клавиши не нажимаются вовремя, что может привести к обсуждаемой ошибке. В этом случае переход на проводную клавиатуру может решить проблему.

  1. Выключите Mac и отсоедините от него беспроводную клавиатуру.
  2. Теперь подключите проводную клавиатуру и включите Mac.Клавиатура MacBook Pro
  3. Подождите, пока система полностью включится, а затем выключите ее.
  4. Теперь включите систему и проверьте, можете ли вы загрузиться в режиме восстановления с помощью клавиш Command & R.

Разбираемся с файлами и папками

Nuxt подготовил для нас готовую структуру, где большинство файлов и папок привязаны к определённому функционалу.

С одной стороны это позволяет не задумываться, где и как хранить файлы, с другой стороны может показаться, что nuxt ограничивает нас. Но скажу по своему опыту, проблем пока не было.

  • .nuxt – это папка. В реальном времени nuxt собирает в неё откомпилированные, но еще не сжатые файлы. При запуске команд npm run dev или npm run build будут использоваться файлы именно из этой папки.
  • components – папка для компонентов страниц. Кнопки, инпуты, селекты и т.д.
  • layouts – обёртки для страниц. Иногда может понадобиться обёртка с сайдбаром слева, например, для админ панели, но в тоже время сайдбар не нужен на страницы авторизации. В этом случае нам и помогут разные лайауты – с сайдбаром и без.
  • middlewares – папка для функций, которые должны запускаться до рендера лайаута или страниц. Через них можно, например, проверять, имеет ли пользователь доступ на определённую страницу, и если нет, то перенаправлять его на специальную страницу.
  • pages – папка для страниц. Созданные в ней файлы преобразуются в роуты. Настраивать ничего не нужно. Подробнее об этом написал ниже.
  • plugins – все плагины, которые будут устанавливаться в проект, должны находиться в этой папке. Это не обязательно, просто так принято.
  • static – папка, в которой обычно хранят фавиконку, различные манифесты, иконки для метаданных и т.д. Файлы в этой папке будут доступны по прямой ссылке, например, http://localhost:3000/favicon.ico
  • store – временное хранилище, которое позволяет централизовать данные.
  • nuxt.config.js – это основной файл настроек. С него и начнем.

1С:Предприятие Бухгалтерия переход с редакции 2.0 на 3.0. Практика перевода информационной базы для работы в управляемом приложении. Промо

Из информационного выпуска 1С № 16872 от 08.07.2013г. стало известно об относительно скором необходимом переходе на редакцию 1С:Бухгалтерия 3.0. В данной публикации будут разобраны некоторые особенности перевода нетиповой конфигурации 1С:Бухгалтерия 2.0 на редакцию 3.0, которая работает в режиме «Управляемое приложение».
Публикация будет дополняться по мере подготовки нового материала. Публикация не является «универсальной инструкцией».

Update 3. Права доступа. 14.08.2013
Update 4. Добавлен раздел 0. Дополнен раздел 4. Добавлен раздел 7. Внесены поправки, актуализирована информация. 23.11.2013.

1 стартмани

Синтаксис

Параметры

Параметр Описание
Указывает имя удаленного сервера, на котором расположена служба. Имя должно использовать формат UNC (например, \мисервер). Чтобы запустить SC.exe локально, не используйте этот параметр.
Указывает имя службы, возвращенное операцией жеткэйнаме .
Указывает тип службы. Эти способы могут быть следующими:
  • собственный — указывает службу, которая выполняется в собственном процессе. Он не предоставляет доступ к исполняемому файлу другим службам. Это значение по умолчанию.
  • Share — указывает службу, которая выполняется как общий процесс. Он использует исполняемый файл совместно с другими службами.
  • kernel — указывает драйвер.
  • филесис — указывает драйвер файловой системы.
  • REC — указывает драйвер, распознаваемый файловой системой, который определяет файловые системы, используемые на компьютере.
  • адаптация — указывает драйвер адаптера, который определяет устройства, такие как клавиатуры, мыши и диски.
  • взаимодействие — указывает службу, которая может взаимодействовать с рабочим столом и получать входные данные от пользователей. Интерактивные службы должны запускаться под учетной записью LocalSystem. Этот тип должен использоваться в сочетании с Type = владеть или Type = Shared (например, Type = взаимодействиеType = владеет). При использовании типа = взаимодействие само по себе вызывает ошибку.
Указывает тип запуска для службы. Эти способы могут быть следующими:
  • Загрузка — указывает драйвер устройства, который загружается загрузчиком.
  • система — указывает драйвер устройства, который запускается во время инициализации ядра.
  • автоматически указывает службу, которая автоматически запускается при каждом перезапуске компьютера и выполняется, даже если никто из них не входит в систему.
  • Demand — указывает службу, которая должна быть запущена вручную. Это значение по умолчанию, если Start = не задано.
  • Disabled (отключено ) — указывает службу, которая не может быть запущена. Чтобы запустить отключенную службу, измените тип запуска на другое значение.
  • отложенный — автоматически указывает службу, которая запускается автоматически через некоторое время после запуска других автоматических служб.
Указывает серьезность ошибки, если служба не запускается при запуске компьютера. Эти способы могут быть следующими:
  • Обычная — указывает, что ошибка записывается в журнал и отображается окно сообщения, информирующее пользователя о том, что не удалось запустить службу. Запуск будет продолжен. Это параметр по умолчанию.
  • серьезная — указывает, что ошибка регистрируется (по возможности). Компьютер пытается перезапуститься с последней удачной конфигурацией. Это может привести к тому, что компьютер сможет перезапуститься, но служба по-прежнему может не запуститься.
  • критическая — указывает, что ошибка записывается в журнал (если возможно). Компьютер пытается перезапуститься с последней удачной конфигурацией. Если последняя удачная конфигурация завершается сбоем, запуск также завершается сбоем, а процесс загрузки останавливается с ошибкой остановки.
  • Ignore — указывает, что ошибка записывается в журнал, и запуск продолжится. Пользователю не выдается уведомление, кроме записи ошибки в журнал событий.
Указывает путь к двоичному файлу службы. Значение по умолчанию для BinPath =, и эта строка должна быть указана.
Указывает имя группы, членом которой является эта служба. Список групп хранится в реестре в подразделе хклм\систем\куррентконтролсет\контрол\сервицеграупордер . По умолчанию используется значение NULL.
Указывает, следует ли получить TagID из вызова CreateService. Теги используются только для драйверов загрузки и запуска системы.
Указывает имена служб или групп, которые должны быть запущены перед этой службой. Имена разделяются косой чертой (/).
указывает имя учетной записи, в которой будет выполняться служба, или задает имя объекта драйвера Windows, в котором будет выполняться драйвер. Значение по умолчанию — LocalSystem.
Указывает описательное имя для идентификации службы в программах пользовательского интерфейса. Например, имя подраздела одной конкретной службы — wuauserv, которое имеет более понятное отображаемое имя автоматическое обновление.
Указывает пароль. Это необходимо, если используется учетная запись, отличная от учетной записи LocalSystem.
/? Отображение справки в командной строке.

Remarks

  • Каждый параметр командной строки (параметр) должен включать знак равенства как часть имени параметра.

  • Между параметром и его значением требуется пробел (например, Type =an). Если пространство не указано, операция завершается ошибкой.

Примеры

Как запустить 1С:Предприятие 8 из командной строки

C:\Program Files\1cv8\bin\1cv8.exe» ENTERPRISE /F D:\Конфигурации\Типовые\УпрТорг /N ИмяПользователя /P Пароль C:\Program Files\1cv8\bin\1cv8.exe» CONFIG /F D:\Конфигурации\Типовые\УпрТорг /N ИмяПользователя /P Пароль C:\Program Files\1cv8\bin\1cv8.exe» ENTERPRISE /S Сервер\База /N ИмяПользователя /P Пароль C:\Program Files\1cv8\bin\1cv8.exe» CONFIG /F D:\Конфигурации\Типовые\УпрТорг /N ИмяПользователя /P Пароль

Как сократить журнал регистрации программно

C:\Program Files\1cv8\bin\1cv8.exe» CONFIG /F»C:\DemoTrd2″ /N»Федоров (администратор)» /P»» /OutD:\my\log.txt /ReduceEventLogSize 2004-12-26 -saveAsC:\OldLog.elf

Как выгрузить модули прикладного решения в виде текстовых файлов из командной строки

C:\Program Files\1cv8\bin\1cv8.exe» CONFIG /F»C:\DemoTrd2″ /N»Федоров (администратор)» /P»» /DumpConfigFiles «D:\1\11» -Module

Настройки биос (bios) для материнской платы под Hive OS

  • Настройте PCIe Link Speed на GEN2
  • Отключите Internal Graphics (если это не нужно вам для монитора)
  • Включите Above 4G Decoding
  • Выключите CSM Support
  • Убедитесь, что приоритет загрузки настроен правильно — устройство хранения, содержащее Hive, должно быть на первом месте
  • (Опционально) Restore AC Power Loss (Power On)

Для ASUS B250 Mining Expert, PCIe Link Speed должна быть настроена в двух разных местах

  • Advanced\PCH Configuration\PCI Express Configuration -> PCIe Speed -> Gen 2
  • Advanced\System Agent (SA) Configuration\PEG Port Configuration -> PCIEX16_1 Link Speed -> Gen 2

И еще несколько рекомендаций касательно B250:

  • Некоторые пользователи сообщают о лучшей совместимости с Gen 1 вместо Gen 2 на более крупных ригах
  • Некоторые пользователи сообщают об улучшенной стабильности при пустом слоте x16_1
  • Обновленный bios может помочь решить множество проблем с платой

Как это сделать, читайте в статье по настройке биоса материнской платы под майнинг.

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Все про сервера
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: