hodza/BlackBox.Shkola.2014 huggingface dataset:
Obx/Docu/Wrappers.odc

Overview by Example: ObxWrappers

This example implements a wrapper. Wrappers are views which contain other views. In particular, a wrapper may have the same size as the view(s) that it wraps. In this way, it can combine its own functionality with that of the wrapped view(s).

For example
 a debugging wrapper lists the messages received by the wrapped view into the log
 a background wrapper adds a background color, over which its wrapped view is drawn (which typically has no background color, i.e., which has a transparent background)
 a layer wrapper contains several layered views, e.g., a graph view overlaid by a caption view
 a terminal wrapper contains a terminal session and wraps a standard text view displaying the log of the session
 a bundling wrapper filters out controller messages, such that the wrapped view becomes read-only etc., the sky's the limit! Wrappers demonstrate the power of composition, i.e., how functionality of different objects can be combined in a very simple manner, without having to use complex language mechanisms such as inheritance.

Our example wrapper simply echoes every key typed into the log.

The wrapper implementation is noteworthy in three respects. First, a wrapper reuses the context of the view which it wraps, it has no context of its own. This is only possible because the wrapper is exactly as large as the wrapped view, because a shared context cannot return different sizes in its GetSize method.
Second, it uses the wrapped view's model (if it has one!) as its own, this means that its ThisModel method returns the wrapped view's model, and that CopyFromModelView propagates the new model to the wrapped view.
Third, the wrapper is implemented in a flexible way which allows it to wrap both views with or without models. This flexibility is concentrated in procedure CopyFromModelView (which admittedly is a bad name in those special cases where the wrapped views don't have models).

	 ObxWrappers.Wrap	(* select view (singleton) before calling this command *)
	 ObxWrappers.Unwrap	(* select view (singleton) before calling this command *)


		(* <== for example, select this view *)

and then type in some characters, and see what happens in the log.

ObxWrapperssources
Obx/Docu/ru/Actions.odc

Описание системы примерами: ObxActions
(C) Перевод на русский язык: Чернышов Л.Н., 2005.

Этот пример демонстрирует, как могут быть реализованы фоновые задачи с помощью действий (actions). Действие - объект, который исполняет некоторое действие позже, когда система не занята, то есть, между действиями пользователя. Действие может быть назначено к исполнению как можно скорее, или по прошествии некоторого времени. После выполнения действие может перепланировать само себя на более позднее время. Таким образом, действие может работать как фоновая задача, получая процессорное время всякий раз, когда система не занята. Такая стратегия называется совместной мультизадачностью (cooperative multitasking). Для того чтобы выполняться, действие не должно делать массивных вычислений, потому что это увеличило бы время отклика системы. Длительные вычисления должны быть разложены на части, занимающие малое время. Это демонстрируется алгоритмом, который вычисляет простые числа до данного максимума в виде фоновой задачи. Действие используется для выполнения пошагового вычисления. Каждое новое найденное простое число записывается в текст. Этот текст остается невидимым пока продолжаются вычисления. Действие проверяет, достигнут ли максимум, установленный пользователем. Если этого еще не произошло, то действие назначает себя для дальнейшего выполнения. В противном случае оно открывает окно со списком простых чисел, то есть, отображение созданного текста.

 "StdCmds.OpenAuxDialog('Obx/Rsrc/Actions', 'Prime Calculation')"

ObxActionssources
Obx/Docu/ru/Address1.odc

Описание системы примерами: ObxAddress1

Этот пример объединяет некоторые возможности предыдущих примеров: он берёт адресную запись ObxAddress1 и добавляет к ней некоторое поведение. Такая запись, чьи поля отображаются на экране как элементы управления, называется интерактором (interactor).

Поведение для нашего примера интерактора определено "внешней" процедурой OpenText. Она создаёт новый текст, в который записываются все поля адресной записи. Поля написаны одной строкой текста, разделены табуляцией и кончаются переводом каретки. Новая текстовая картинка (отображение) открывается в окне.

	MODULE ObxAddress1;

	IMPORT Views, TextModels, TextMappers, TextViews;

	VAR
		adr*: RECORD
			name*:	ARRAY 64 OF CHAR;
			city*:		ARRAY 24 OF CHAR;
			country*:	ARRAY 16 OF CHAR;
			customer*:	INTEGER;
			update*:	BOOLEAN
		END;

	PROCEDURE OpenText*;
		VAR t: TextModels.Model; f: TextMappers.Formatter; v: Views.View;
	BEGIN
		t := TextModels.dir.New();  (* задаем пустой текстовый контейнер *)
		f.ConnectTo(t);		(* присоединяем к контейнеру форматтер *)		
		f.WriteString(adr.name); f.WriteTab; (* заполняем контейнер строчками текста *)
		f.WriteString(adr.city); f.WriteTab;
		f.WriteString(adr.country); f.WriteTab;
		f.WriteInt(adr.customer); f.WriteTab;
		f.WriteBool(adr.update); f.WriteLn;
		v := TextViews.dir.New(t);		(* переводим текстовый контейнер в отображение *)
		Views.OpenView(v)		(* открываем окно с отображением *)
	END OpenText;

END ObxAddress1.

После того, как пример будет откомпилирован, и после того, как для него будет создана форма и переведена в режим диалога, вы можете ввести что-либо в поля (заметьте, что поле customer допускает только целочисленные значения). Далее кликните на кнопку OpenText. Откроется окно с примерно таким содержанием:

Oberon microsystems	Technoparkstrasse 1	Zьrich	ZH	8005	Switzerland	1	$TRUE


В данном примере мы увидели, как можно добавить интеракторам поведение, присоединяя внешние (доступные извне) процедуры к их полям.

Текст перевёл Адаменко Оскар. гр. 08-302.
Комментарии в примере - А.И. Попков
Obx/Docu/ru/Address2.odc

Описание системы примерами: ObxAddress2

Этот пример сочетает возможности предыдущих примеров: он позволяет вводить адреса при помощи маски, а кнопка вызывает добавление введённых данных в текст файла. Затем введённые данные удаляются из окна. Элементы управления должны быть уведомлены, когда программа изменяет интерактор. Для этого используется процедура Dialog.Update, в параметрах которой передается интерактор.
	MODULE ObxAddress2;

	IMPORT Files, Converters, Views, Dialog, TextModels, TextMappers, TextViews;

	VAR
		adr*: RECORD
			name*:	ARRAY 64 OF CHAR;
			city*:		ARRAY 24 OF CHAR;
			country*:	ARRAY 16 OF CHAR;
			customer:	INTEGER;
			update*:	BOOLEAN
		END;

	PROCEDURE OpenText*;
		VAR loc: Files.Locator; name: Files.Name; conv: Converters.Converter;
			v: Views.View; t: TextModels.Model; f: TextMappers.Formatter;
	BEGIN
		loc := NIL; name := ""; conv := NIL;
		v := Views.Old(Views.ask, loc, name, conv);
		IF (v # NIL) & (v IS TextViews.View) THEN
			t := v(TextViews.View).ThisModel();
			f.ConnectTo(t);
			f.SetPos(t.Length());
			f.WriteString(adr.name); f.WriteTab;
			f.WriteString(adr.city); f.WriteTab;
			f.WriteString(adr.country); f.WriteTab;
			f.WriteInt(adr.customer); f.WriteTab;
			f.WriteBool(adr.update); f.WriteLn;
			Views.OpenView(v);
			adr.name := ""; adr.city := ""; adr.country := ""; adr.customer := 0; adr.update := FALSE;
			Dialog.Update(adr)	(* update all controls for adr *)
		END
	END OpenText;

END ObxAddress2.

Текст перевёл Адаменко Оскар. гр.08-302
Obx/Docu/ru/Bitmap.odc

Описание системы примерами: ObxBitmap
(C) Перевод на русский язык: Чернышов Л.Н., 2005.

Этот пример показывает, как может использоваться программирование под Windows для создания растрового изображения (bitmap) Windows и вывода его в отображении Блэкбокса. За дополнительной информацией см. Особенностиплатформы и документацию по Win32 API.

"ObxBitmap.Deposit; StdCmds.Open"

ObxBitmapsources
Obx/Docu/ru/BlackBox.odc

Описание системы примерами: ObxBlackBox

Этот пример реализует дедуктивную игру BlackBox, используя BlackBox Component Framework. Цель игры - угадать позиции атомов в рамках решетки n*n, облучая решетку лучами (в черном ящике). Лучи могут изменять направление и даже поглощаться.    ,     . Для получения более полной информации о BlackBox и о том, как играть в эту игру, читайте правила.

Главная цель примера - показать преимущество составных документов: интерактивное отображение ObxBlackBox может быть напрямую использовано в документации для иллюстрации поставленной цели. Ни дополнительный код, ни использование графических редакторов не требуются. Более того, эти отображения в документации - "живые" элементы и могут быть исследованы и изменены по желанию.

Пример также иллюстрирует, как для отображения может быть использовано специализированное меню. Если отображение BlackBox - находится в фокусе ввода, то появляется специальное меню, предлагающее специфические команды, которые выполняются над фокусным отображением. Для этой цели следующее меню устанавливается в файл меню подсистемы Obx (-> Menus):


MENU "BlackBox" ("ObxBlackBox.View")
"Show Solution"		""	"ObxBlackBox.ShowSolution"	"ObxBlackBox.ShowSolutionGuard"
	SEPARATOR
	"New Atoms"	""	"ObxBlackBox.New"	""
	"Set New Atoms"	""	"ObxBlackBox.Set"	""
	SEPARATOR
	"Rules"	""	"StdCmds.OpenBrowser('Obx/Docu/BB-Rules', 'BlackBox Rules')"	""
END
Первый пункт меню доступен или скрыт в зависимости от состояния фокусного отображения. Охранная процедура служит именно для этого. Для получения более полной информации о BlackBox и о том, как играть в эту игру, читайте правила.

"StdCmds.OpenAuxDialog('Obx/Rsrc/BlackBoxRu', 'BlackBox')"

ObxBlackBoxsources

Перевел студент группы 08-302 Забелин И.С.
Obx/Docu/ru/Calc.odc

Описание системы примерами: ObxCalc
(C) Перевод на русский язык: Чернышов Л.Н., 2005.

Этот пример реализует отображение (view) простого карманного калькулятора для целых чисел. Калькулятором можно пользоваться как с клавиатуры, так и с помощью мыши. Он реализован как стековый калькулятор. Отображается вершина стека. Клавишей ^ (или ENTER на клавиатуре) это значение дублируется и помещается в стек. Клавиша P выполняет операцию выталкивания (pop), в результате которого верхнее значение заменяется вторым следующим за ним значением. Клавишей S два верхних значения в стеке могут быть переставлены. Выражения должны вычисляться с использованием обратной польской записи. Арифметические операции заменяют два верхних значения результатом. Клавиша / отвечает за деление, а Ч - за остаток. Например, чтобы сложить 12 и 25, нужно нажать клавиши 12^25+. Первоначально стек заполнен нулями.

Реализация достаточно проста. Отображение ObxCalc не содержат модели. Каждое отображение содержит собственный стек. Когда калькулятор копируется, состояние копии получается очищенным.
Состояние калькулятора - не экстернализируется. Это означает, что любой загруженный из файла калькулятор находится в очищенном состоянии.

С точки зрения программирования отображений представляют интерес следующие связанные с типом процедуры:

	Restore	выводит отображение на экран.
		HandleCtrlMsg	обрабатывает все сообщения диспетчера, которые отправляются отображению, в частности, когда кнопка мыши (Controllers.TrackMsg) или клавиша (Controllers.EditMsg) нажимаются в пределах картинки.
		HandlePropMsg	обрабатывает сообщения о свойствах, которые посылаются отображению ее контейнером. Контейнер спрашивает отображение о его предпочтительном размере (Properties.SizePref), можно ли изменить его размер (Properties.ResizePref) и хочет ли оно приобрести фокус (Properties.FocusPref).		Externalize	экстернализирует байт версии		Internalize          	 читает байт версии и инициализирует новую картинку											
Реализовав всего лишь эти пять процедур, мы получаем полнофункциональное диалоговое отображение. Отображение может быть сохранено в файл (без его внутреннего состояния) и скопировано с использованием Drag & Drop или Copy & Paste, оно может быть распечатано, и под Windows оно может экспортироваться как ActiveX-объект в любой ActiveX-контейнер.

 "ObxCalc.Deposit; StdCmds.Open"

ObxCalcsources
Obx/Docu/ru/Caps.odc

Описание системы примерами: ObxCaps

Этот пример показывает, как встроенная подсистема построения текста в Блэкбоксе может быть расширена новыми командами. Чтобы продемонстрировать эту возможность, будет показана команда, которая завершает выделение мышкой в отображении (предположим, что отображение (view) в фокусе -  текстовое отображение), создает новый "пустой" текст, копирует выделенный фрагмент в этот новый текст (но при этом преобразует все маленькие буквы в заглавные), и затем замещает выделенный фрагмент недавно созданным текстом. Вкратце, эта команда переписывает выделенный текст заглавными буквами.

	MODULE ObxCaps;

	IMPORT Stores, Models, TextModels, TextControllers;

	PROCEDURE Do*;
		VAR c: TextControllers.Controller; beg, end: INTEGER;
			r: TextModels.Reader; ch: CHAR;
			buf: TextModels.Model; w: TextModels.Writer; script: Stores.Operation;
	BEGIN
		c := TextControllers.Focus();
		IF (c # NIL) & c.HasSelection() THEN
			c.GetSelection(beg, end);
			(* переведенный в верхний регистр текст будет скопирован в буфер *)
			buf := TextModels.CloneOf(c.text); w := buf.NewWriter(NIL);
			r := c.text.NewReader(NIL); r.SetPos(beg);
			r.ReadChar(ch);
			WHILE (r.Pos() <= end) & ~r.eot DO
				IF (ch >= "a") & (ch <= "z") THEN ch := CAP(ch) END;
				IF (ch >= "а") & (ch <= "я") THEN ch := CHR(ORD(ch)-32) END; (* для кириллицы *)
				IF ch = "ё" THEN ch := "Ё" END;					
				w.WriteChar(ch);
				r.ReadChar(ch)
			END;
			Models.BeginScript(c.text, "Caps", script);
			c.text.Delete(beg, end); c.text.Insert(beg, buf, 0, end - beg);
			Models.EndScript(c.text, script)
		END
	END Do;

END ObxCaps.


Для примера, выделите тестовую строку, расположенную несколькими строками  ниже, и затем кликните командер:
ObxCaps.Do

teSTstring834 .-st  абвгдеёжзиклмнопрстуфхцчшщьыъэюя 

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

А теперь сюрприз: выполните команду Отменить ... в меню Правка. В результате эффект верхнего регистра исчез! В Блэкбоксе многие операции обратимы; это также относится к текстовым процедурам Delete и Insert в вышеописанном образце. Таким образом, вам не надо делать ничего особенного, чтобы сделать такую команду отменяемой!

Однако, вы могли обратить внимание, что есть кое-что специфическое в этой простой программе: есть пара процедурных вызовов BeginScript / EndScript, между которыми вызываются Delete/Insert. Они связывают последовательность из Delete и следующего за ним Insert в одну сложную команду, подразумевая, что пользователю не нужно отменять обе эти операции по отдельности, а достаточно сделать это за один шаг.

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

Перевел студент группы 08-302 Забелин И.С.
Obx/Docu/ru/ContIter.odc

Описание системы примерами: ObxContIter

Этот пример показывает, как производить перебор картинок (views), вложенных в контейнер, будь то текстовый контейнер, контейнер форм и т.д. Команда ищет первую вложенную картинку, чья метка - "магическое имя". В начале команда получает фокус контейнера для управления:

	c := Containers.Focus();

Эта инструкция получает  самый внутренний контролер общего контейнера по фокусной траектории, даже если контейнер находится в режиме маски или в режиме просмотра и некоторый элемент управления контейнера в настоящий момент представляет собой самую дальнюю (не контейнерную) картинку. Каждый общий контейнер определяет некоторый порядок для внедренных картинок. Для текстов - это порядок картинок в тексте, для форм - это z-упорядочивание и т.д. Методы контролера GetFirstView и GetNextView позволяют осуществить переьор вложенных картинок в определенном порядке: 

	c.GetFirstView(Containers.any, v);
	c.GetNextView(Containers.any, v);

Первые параметры обозначают,  все ли вложенные картинки должны пересекаться (Containers.any) или только выбранные (Conteiner.selection). Цикл, ищущий особенный элемент управления имеет стандартную форму поискового цикла:

	get first element;
	WHILE (element # NIL) & ~(element is the right one) DO
		get next element
	END;

В нашем примере условие в цикле WHILE следующее:

	(v # NIL) & ~((v IS Controls.Control) & (v(Controls.Control).label = "magic name"))

Правосторонний элемент содержит выражение, показывающее "тот ли это элемент":

	(v IS Controls.Control) & (v(Controls.Control).label = "magic name")

Это значит, что элемент - это контролер, и его метка - "магическое имя". Оператор инверсии "~" инвертирует это условие таким образом, что цикл длится так долго, пока не найдется правый элемент.

Заметьте, что вы не должны модифицировать выборку во время осуществления итерации. Также вам не следует вставлять в контейнер или удалять из него модели во время осуществления итерации.

ObxContItersources
						
Перевел студент группы 08-302 Забелин И.С.
Obx/Docu/ru/Conv.odc

Описание системы примерами: ObxConv
(C) Перевод на русский язык: Чернышов Л.Н., 2005.

	В то время как большинство файлов с данными представляют собой файлы документов Блэкбокса, иногда возникает необходимость иметь дело с другими форматами файлов: ASCII-файлы, изображения или файлы, созданные при помощи старых приложений. Иногда достаточно просто импортировать данные один раз и затем сохранить их в качестве документа Блэкбокса, иногда необходимо экспортировать данные в некоторый (не Блэкбокса) формат файлов, и иногда даже желательно импортировать данные из этого формата файлов при их открытии и экспортировать         перед тем, как сохранить файл. Конечно, последнее сработает нормально, если только преобразование является действительно обратимым, то есть импорт и экспорт идут без потерь.
	Пример ObxConv показывает простой ASCII конвертор, который преобразовывает как в, так и из стандартного представления текста в Блэкбоксе. Модуль содержит две команды - импортер и экспортер. 
	Обе команды имеют одинаковую структуру: в цикле по всем символам текста каждый символ читается (из текстового или другого файла) и затем записывается (в тектовый или другой файл).
	Конвертеры часто бывают независимы от платформы . В нашем примере это видно из выражения, которое проверяет правильность типа файла. В Windows следует писать:

	ASSERT(f.type = "TXT", 22)
		
В Mac OS следует писать:

	ASSERT(f.type = "TEXT", 22)

	 , символы    из присущего данной среде    в ( из)   ,  Блэкбоксом. Этого  не сделано,       существенного       .

	Каждое выполнение Блэкбокса обеспечивается  собственным набором  ,       доступными ,   .        Config.Setup, которая вызывается процедурой Converters.Register:

Windows:
Converters.Register("ObxConv.ImportText", "ObxConv.ExportText", "TextViews.View", "TXT", {})

Mac OS:
Converters.Register("ObxConv.ImportText", "ObxConv.ExportText", "TextViews.View", "TEXT", {})

Config.Setup вызывается в    "bootstrap" Блэкбокса,       .

   конвертера    соответствующее  ,       /   . ,  "ObxConv.ImportText" можно представить в более удобном названии "Obx Text" (    ). Представление реализовано   Strings  директории Rsrc  , ,  тексте Obx/Rsrc/Strings   строчка: 

	ObxConv.ImportText	Obx Text File

Возможно использовать   конверторы: HTML - конвертер, ,    ASCII-конвертер  Блэкбокса ( ,  HostTextConv),     из  ASCII в  текст Блэкбокса.           ,   некоторые виды связей гипертекста вместо точно указанных гиперссылок.


ObxConvsources
Obx/Docu/ru/Cubes.odc

Описание системы примерами: ObxCubes
(C) Перевод на русский язык: Чернышов Л.Н., 2005.

Этот пример реализует отображение (view) вращающегося куба. Куб вращается вокруг двух осей. Он совершает 10 преобразований положения в секунду и после 25.6 секунд возвращается в свою исходную позицию. Пример, демонстрируемый ниже, показывает большой куб, вращающийся перед меньшим. Оба куба внедрены в отображение-форму, которая внедрена в текстовое отображение, которое вы в данный момент читаете:
			

Этот пример показывает действия (actions). Services.Actions - объекты, процедуры Do которых выполняются отложенно, когда система простаивает. Действие, которое повторно устанавливает себя всякий раз, когда оно вызывается как в этом примере, работает как непрерывающая (фоновая) задача.

Этот пример также демонстрирует простой редактор свойств, с помощью которого  могут быть изменены цвета сторон куба. Для того чтобы открыть редактор свойств, щелкните на кубе при удерживании клавиши Ctrl (или выполните команду, указанную ниже, чтобы открыть диалог). Редактор свойств всегда показывает цвета выбранного куба. Синхронизация между цветными полями в диалоге и выбранном кубе также выполнена через установленное действие (action). Цвета сторон фактически изменяются уведомителем (notifier), который присоединен к каждому элементу управления цветом в диалоге свойств. Цвет белый интерпретируется как прозрачный.


 "ObxCubes.Deposit; StdCmds.Open"
 "StdCmds.OpenToolDialog('Obx/Rsrc/Cubes', 'Cube Colors')"

ObxCubessources
Obx/Docu/ru/Db.odc

Описание системы примерами: ObxDb

Этот пример даёт пользователю две команды. Первая, EnterData, берёт выделенный текст на входе и считывает его строка за строкой. Каждая строка должна содержать целое число, затем строку символов и, наконец, вещественное число. Каждый такой кортеж вносится в глобально закреплённый линейный список с сортировкой по значению целого числа. Вторая команда, ListData, генерирует текст, который отражает данные из списка.

ObxDbsources


 ObxDb.EnterData		 ObxDb.ListData		 ObxDb.Reset

Для того, чтобы опробовать пример, выделите следующие три строки, а затем кликните левый коммандер, расположенный выше:

1	Cray	14.8
3	NEC	16.6
2	IBM	8.3

Теперь кликните средний коммандер, в результате откроется окно с отсортированными входными данными. Если вы повторите те же действия, вы заметите, что входные данные добавлены в список ещё раз, и, следовательно, каждый пункт  на выходе будет присутствовать в двух экземплярах.

Этот пример показал, как из текста можно сразу читать составные данные, а не только буквы.

Текст перевёл Адаменко Оскар. 08-302
Obx/Docu/ru/Dialog.odc

Описание системы примерами: ObxDialog

Этот пример демонстрирует поля интерактора типа список, выбор и комбинированный список с соответствующими элементами управления. К тому же используются уведомители и охранные процедуры.

 "StdCmds.OpenAuxDialog('Obx/Rsrc/Dialog', 'ObxDialog Demo')"

ObxDialogsources

Текст перевёл Адаменко Оскар.08-302
Obx/Docu/ru/Excel.odc

Описание системы примерами: ObxExcel
(C) Перевод на русский язык: Чернышов Л.Н., 2005.

Этот пример того, как подсистема автоматизации OLE может использоваться для работы с программой Microsoft Excel. Используйте следующие пункты меню для управления примерами:

	"Show Excel"	""	"ObxExcel.ShowExcel"	""
	"Read Excel"	""	"ObxExcel.ReadExcel"	"StdCmds.SingletonGuard"
	"Open Chart"	""	"ObxExcel.OpenChart"	"StdCmds.SingletonGuard"

ShowExcel добавляет различные значения к новому рабочему листу и открывает лист как OLE-объект в тексте Блэкбокса.
ReadExcel читает выбранный лист и пишет содержимое ячеек в рабочий журнал.
OpenChart использует значения выбранного листа и открывает соответствующую диаграмму в отдельном окне Excel.

См. также CtlDeveloperManual.

ObxExcelsources
Obx/Docu/ru/Fact.odc

Описание системы примерами: ObxFact
(C) Перевод на русский язык: Чернышов Л.Н., 2005.

Данный пример демонстрирует использование модуля Integers, который содержит реализацию  целых чисел произвольной точности. Пример реализует команду ObxFact.Compute, которая подсчитывает факториал целого числа, выделенного в тексте (в текстовом отображении), и заменяет выделение на результат.

Пример:
	25	->	15511210043330985984000000
	
Примечание: время, требуемое компьютером на вычисление факториала, находится в экспоненциальной зависимости от вводимого числа. Для чисел больше 5000 требуется значительное время для вычислений.

ObxFactsources

Выделите любое число и нажмите на кнопку коммандера:

ObxFact.Compute 4 7 10 15 25 50 100 150 200 300 400 500 700 1000 2000 5000