aboutsummaryrefslogtreecommitdiffstats
path: root/lib/pman
diff options
context:
space:
mode:
authorErlang/OTP <[email protected]>2009-11-20 14:54:40 +0000
committerErlang/OTP <[email protected]>2009-11-20 14:54:40 +0000
commit84adefa331c4159d432d22840663c38f155cd4c1 (patch)
treebff9a9c66adda4df2106dfd0e5c053ab182a12bd /lib/pman
downloadotp-84adefa331c4159d432d22840663c38f155cd4c1.tar.gz
otp-84adefa331c4159d432d22840663c38f155cd4c1.tar.bz2
otp-84adefa331c4159d432d22840663c38f155cd4c1.zip
The R13B03 release.OTP_R13B03
Diffstat (limited to 'lib/pman')
-rw-r--r--lib/pman/AUTHORS9
-rw-r--r--lib/pman/Makefile34
-rw-r--r--lib/pman/doc/html/.gitignore0
-rw-r--r--lib/pman/doc/man3/.gitignore0
-rw-r--r--lib/pman/doc/pdf/.gitignore0
-rw-r--r--lib/pman/doc/src/Makefile116
-rw-r--r--lib/pman/doc/src/book.xml43
-rw-r--r--lib/pman/doc/src/fascicules.xml18
-rw-r--r--lib/pman/doc/src/main_window.gifbin0 -> 14431 bytes
-rw-r--r--lib/pman/doc/src/main_window.ps1573
-rw-r--r--lib/pman/doc/src/make.dep26
-rw-r--r--lib/pman/doc/src/note.gifbin0 -> 1539 bytes
-rw-r--r--lib/pman/doc/src/notes.xml144
-rw-r--r--lib/pman/doc/src/options.gifbin0 -> 5218 bytes
-rw-r--r--lib/pman/doc/src/options.ps829
-rw-r--r--lib/pman/doc/src/part.xml37
-rw-r--r--lib/pman/doc/src/part_notes.xml39
-rw-r--r--lib/pman/doc/src/pman.xml82
-rw-r--r--lib/pman/doc/src/pman_chapter.xml371
-rw-r--r--lib/pman/doc/src/ref_man.xml37
-rw-r--r--lib/pman/doc/src/toolbar.gifbin0 -> 6848 bytes
-rw-r--r--lib/pman/doc/src/trace.gifbin0 -> 9829 bytes
-rw-r--r--lib/pman/doc/src/trace.ps1312
-rw-r--r--lib/pman/doc/src/warning.gifbin0 -> 1498 bytes
-rw-r--r--lib/pman/ebin/.gitignore0
-rw-r--r--lib/pman/info2
-rw-r--r--lib/pman/priv/Makefile58
-rw-r--r--lib/pman/priv/pman.gifbin0 -> 199 bytes
-rw-r--r--lib/pman/priv/pman.tool6
-rw-r--r--lib/pman/src/Makefile112
-rw-r--r--lib/pman/src/assert.hrl81
-rw-r--r--lib/pman/src/pman.app.src40
-rw-r--r--lib/pman/src/pman.appup.src19
-rw-r--r--lib/pman/src/pman.erl132
-rw-r--r--lib/pman/src/pman_buf.erl117
-rw-r--r--lib/pman/src/pman_buf.hrl29
-rw-r--r--lib/pman/src/pman_buf_buffer.erl102
-rw-r--r--lib/pman/src/pman_buf_converter.erl189
-rw-r--r--lib/pman/src/pman_buf_printer.erl89
-rw-r--r--lib/pman/src/pman_buf_utils.erl106
-rw-r--r--lib/pman/src/pman_main.erl787
-rw-r--r--lib/pman/src/pman_module_info.erl131
-rw-r--r--lib/pman/src/pman_options.erl395
-rw-r--r--lib/pman/src/pman_options.hrl34
-rw-r--r--lib/pman/src/pman_process.erl317
-rw-r--r--lib/pman/src/pman_relay.erl127
-rw-r--r--lib/pman/src/pman_relay_server.erl57
-rw-r--r--lib/pman/src/pman_shell.erl823
-rw-r--r--lib/pman/src/pman_tool.erl145
-rw-r--r--lib/pman/src/pman_win.erl667
-rw-r--r--lib/pman/src/pman_win.hrl39
-rw-r--r--lib/pman/vsn.mk1
52 files changed, 9275 insertions, 0 deletions
diff --git a/lib/pman/AUTHORS b/lib/pman/AUTHORS
new file mode 100644
index 0000000000..5a354526b4
--- /dev/null
+++ b/lib/pman/AUTHORS
@@ -0,0 +1,9 @@
+pman was first implemented for the old X windows interface "pxw" by
+Claes Wikstr�m and has since then been rewritten a couple of times by
+among others Peter Olin.
+
+Original Authors and Contributors:
+
+Claes Wikstr�m
+Peter Olin
+Gunilla Arendt \ No newline at end of file
diff --git a/lib/pman/Makefile b/lib/pman/Makefile
new file mode 100644
index 0000000000..3600504d07
--- /dev/null
+++ b/lib/pman/Makefile
@@ -0,0 +1,34 @@
+#
+# %CopyrightBegin%
+#
+# Copyright Ericsson AB 1996-2009. All Rights Reserved.
+#
+# The contents of this file are subject to the Erlang Public License,
+# Version 1.1, (the "License"); you may not use this file except in
+# compliance with the License. You should have received a copy of the
+# Erlang Public License along with this software. If not, it can be
+# retrieved online at http://www.erlang.org/.
+#
+# Software distributed under the License is distributed on an "AS IS"
+# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+# the License for the specific language governing rights and limitations
+# under the License.
+#
+# %CopyrightEnd%
+#
+include $(ERL_TOP)/make/target.mk
+include $(ERL_TOP)/make/$(TARGET)/otp.mk
+
+# ----------------------------------------------------
+# Common Macros
+# ----------------------------------------------------
+
+SUB_DIRECTORIES = src priv doc/src
+
+SPECIAL_TARGETS =
+
+# ----------------------------------------------------
+# Default Subdir Targets
+# ----------------------------------------------------
+include $(ERL_TOP)/make/otp_subdir.mk
+
diff --git a/lib/pman/doc/html/.gitignore b/lib/pman/doc/html/.gitignore
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/pman/doc/html/.gitignore
diff --git a/lib/pman/doc/man3/.gitignore b/lib/pman/doc/man3/.gitignore
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/pman/doc/man3/.gitignore
diff --git a/lib/pman/doc/pdf/.gitignore b/lib/pman/doc/pdf/.gitignore
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/pman/doc/pdf/.gitignore
diff --git a/lib/pman/doc/src/Makefile b/lib/pman/doc/src/Makefile
new file mode 100644
index 0000000000..4e116cb23e
--- /dev/null
+++ b/lib/pman/doc/src/Makefile
@@ -0,0 +1,116 @@
+#
+# %CopyrightBegin%
+#
+# Copyright Ericsson AB 1997-2009. All Rights Reserved.
+#
+# The contents of this file are subject to the Erlang Public License,
+# Version 1.1, (the "License"); you may not use this file except in
+# compliance with the License. You should have received a copy of the
+# Erlang Public License along with this software. If not, it can be
+# retrieved online at http://www.erlang.org/.
+#
+# Software distributed under the License is distributed on an "AS IS"
+# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+# the License for the specific language governing rights and limitations
+# under the License.
+#
+# %CopyrightEnd%
+#
+#
+include $(ERL_TOP)/make/target.mk
+include $(ERL_TOP)/make/$(TARGET)/otp.mk
+
+# ----------------------------------------------------
+# Application version
+# ----------------------------------------------------
+include ../../vsn.mk
+VSN=$(PMAN_VSN)
+APPLICATION=pman
+
+# ----------------------------------------------------
+# Release directory specification
+# ----------------------------------------------------
+RELSYSDIR = $(RELEASE_PATH)/lib/$(APPLICATION)-$(VSN)
+
+# ----------------------------------------------------
+# Target Specs
+# ----------------------------------------------------
+XML_APPLICATION_FILES = ref_man.xml
+XML_REF3_FILES = pman.xml
+
+XML_PART_FILES = part.xml part_notes.xml
+XML_CHAPTER_FILES = pman_chapter.xml notes.xml
+
+BOOK_FILES = book.xml
+
+XML_FILES = \
+ $(BOOK_FILES) $(XML_CHAPTER_FILES) \
+ $(XML_PART_FILES) $(XML_REF3_FILES) $(XML_APPLICATION_FILES)
+
+GIF_FILES = \
+ main_window.gif \
+ trace.gif \
+ options.gif
+
+# ----------------------------------------------------
+
+HTML_FILES = $(XML_APPLICATION_FILES:%.xml=$(HTMLDIR)/%.html) \
+ $(XML_PART_FILES:%.xml=$(HTMLDIR)/%.html)
+
+INFO_FILE = ../../info
+
+MAN3_FILES = $(XML_REF3_FILES:%.xml=$(MAN3DIR)/%.3)
+
+HTML_REF_MAN_FILE = $(HTMLDIR)/index.html
+
+TOP_PDF_FILE = $(PDFDIR)/$(APPLICATION)-$(VSN).pdf
+
+
+# ----------------------------------------------------
+# FLAGS
+# ----------------------------------------------------
+XML_FLAGS +=
+
+# ----------------------------------------------------
+# Targets
+# ----------------------------------------------------
+$(HTMLDIR)/%.gif: %.gif
+ $(INSTALL_DATA) $< $@
+
+docs: pdf html man
+
+$(TOP_PDF_FILE): $(XML_FILES)
+
+pdf: $(TOP_PDF_FILE)
+
+html: gifs $(HTML_REF_MAN_FILE)
+
+man: $(MAN3_FILES)
+
+gifs: $(GIF_FILES:%=$(HTMLDIR)/%)
+
+debug opt:
+
+clean clean_docs:
+ rm -rf $(HTMLDIR)/*
+ rm -f $(MAN3DIR)/*
+ rm -f $(TOP_PDF_FILE) $(TOP_PDF_FILE:%.pdf=%.fo)
+ rm -f errs core *~
+
+# ----------------------------------------------------
+# Release Target
+# ----------------------------------------------------
+include $(ERL_TOP)/make/otp_release_targets.mk
+
+release_docs_spec: docs
+ $(INSTALL_DIR) $(RELSYSDIR)/doc/pdf
+ $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELSYSDIR)/doc/pdf
+ $(INSTALL_DIR) $(RELSYSDIR)/doc/html
+ $(INSTALL_DATA) $(HTMLDIR)/* \
+ $(RELSYSDIR)/doc/html
+ $(INSTALL_DATA) $(INFO_FILE) $(RELSYSDIR)
+ $(INSTALL_DIR) $(RELEASE_PATH)/man/man3
+ $(INSTALL_DATA) $(MAN3DIR)/* $(RELEASE_PATH)/man/man3
+
+
+release_spec:
diff --git a/lib/pman/doc/src/book.xml b/lib/pman/doc/src/book.xml
new file mode 100644
index 0000000000..5d1d277fb7
--- /dev/null
+++ b/lib/pman/doc/src/book.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE book SYSTEM "book.dtd">
+
+<book xmlns:xi="http://www.w3.org/2001/XInclude">
+ <header titlestyle="normal">
+ <copyright>
+ <year>1997</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ The contents of this file are subject to the Erlang Public License,
+ Version 1.1, (the "License"); you may not use this file except in
+ compliance with the License. You should have received a copy of the
+ Erlang Public License along with this software. If not, it can be
+ retrieved online at http://www.erlang.org/.
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and limitations
+ under the License.
+
+ </legalnotice>
+
+ <title>Pman</title>
+ <prepared></prepared>
+ <docno></docno>
+ <date></date>
+ <rev></rev>
+ </header>
+ <pagetext>Pman</pagetext>
+ <preamble>
+ </preamble>
+ <parts lift="no">
+ <xi:include href="part.xml"/>
+ </parts>
+ <applications>
+ <xi:include href="ref_man.xml"/>
+ </applications>
+ <releasenotes>
+ <xi:include href="notes.xml"/>
+ </releasenotes>
+</book>
+
diff --git a/lib/pman/doc/src/fascicules.xml b/lib/pman/doc/src/fascicules.xml
new file mode 100644
index 0000000000..0678195e07
--- /dev/null
+++ b/lib/pman/doc/src/fascicules.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE fascicules SYSTEM "fascicules.dtd">
+
+<fascicules>
+ <fascicule file="part" href="part_frame.html" entry="no">
+ User's Guide
+ </fascicule>
+ <fascicule file="ref_man" href="ref_man_frame.html" entry="yes">
+ Reference Manual
+ </fascicule>
+ <fascicule file="part_notes" href="part_notes_frame.html" entry="no">
+ Release Notes
+ </fascicule>
+ <fascicule file="" href="../../../../doc/print.html" entry="no">
+ Off-Print
+ </fascicule>
+</fascicules>
+
diff --git a/lib/pman/doc/src/main_window.gif b/lib/pman/doc/src/main_window.gif
new file mode 100644
index 0000000000..e12754631c
--- /dev/null
+++ b/lib/pman/doc/src/main_window.gif
Binary files differ
diff --git a/lib/pman/doc/src/main_window.ps b/lib/pman/doc/src/main_window.ps
new file mode 100644
index 0000000000..c66620c677
--- /dev/null
+++ b/lib/pman/doc/src/main_window.ps
@@ -0,0 +1,1573 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: (ImageMagick)
+%%Title: (./main_window.tmp.eps)
+%%CreationDate: (Tue Jun 12 18:03:36 2001)
+%%BoundingBox: 0 22 377 234
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 1
+%%Pages: 0
+%%EndComments
+
+%%BeginDefaults
+%%PageOrientation: Portrait
+%%EndDefaults
+
+%%BeginProlog
+%
+% Display a color image. The image is displayed in color on
+% Postscript viewers or printers that support color, otherwise
+% it is displayed as grayscale.
+%
+/buffer 512 string def
+/byte 1 string def
+/color_packet 3 string def
+/pixels 768 string def
+
+/DirectClassPacket
+{
+ %
+ % Get a DirectClass packet.
+ %
+ % Parameters:
+ % red.
+ % green.
+ % blue.
+ % length: number of pixels minus one of this color (optional).
+ %
+ currentfile color_packet readhexstring pop pop
+ compression 0 gt
+ {
+ /number_pixels 3 def
+ }
+ {
+ currentfile byte readhexstring pop 0 get
+ /number_pixels exch 1 add 3 mul def
+ } ifelse
+ 0 3 number_pixels 1 sub
+ {
+ pixels exch color_packet putinterval
+ } for
+ pixels 0 number_pixels getinterval
+} bind def
+
+/DirectClassImage
+{
+ %
+ % Display a DirectClass image.
+ %
+ systemdict /colorimage known
+ {
+ columns rows 8
+ [
+ columns 0 0
+ rows neg 0 rows
+ ]
+ { DirectClassPacket } false 3 colorimage
+ }
+ {
+ %
+ % No colorimage operator; convert to grayscale.
+ %
+ columns rows 8
+ [
+ columns 0 0
+ rows neg 0 rows
+ ]
+ { GrayDirectClassPacket } image
+ } ifelse
+} bind def
+
+/GrayDirectClassPacket
+{
+ %
+ % Get a DirectClass packet; convert to grayscale.
+ %
+ % Parameters:
+ % red
+ % green
+ % blue
+ % length: number of pixels minus one of this color (optional).
+ %
+ currentfile color_packet readhexstring pop pop
+ color_packet 0 get 0.299 mul
+ color_packet 1 get 0.587 mul add
+ color_packet 2 get 0.114 mul add
+ cvi
+ /gray_packet exch def
+ compression 0 gt
+ {
+ /number_pixels 1 def
+ }
+ {
+ currentfile byte readhexstring pop 0 get
+ /number_pixels exch 1 add def
+ } ifelse
+ 0 1 number_pixels 1 sub
+ {
+ pixels exch gray_packet put
+ } for
+ pixels 0 number_pixels getinterval
+} bind def
+
+/GrayPseudoClassPacket
+{
+ %
+ % Get a PseudoClass packet; convert to grayscale.
+ %
+ % Parameters:
+ % index: index into the colormap.
+ % length: number of pixels minus one of this color (optional).
+ %
+ currentfile byte readhexstring pop 0 get
+ /offset exch 3 mul def
+ /color_packet colormap offset 3 getinterval def
+ color_packet 0 get 0.299 mul
+ color_packet 1 get 0.587 mul add
+ color_packet 2 get 0.114 mul add
+ cvi
+ /gray_packet exch def
+ compression 0 gt
+ {
+ /number_pixels 1 def
+ }
+ {
+ currentfile byte readhexstring pop 0 get
+ /number_pixels exch 1 add def
+ } ifelse
+ 0 1 number_pixels 1 sub
+ {
+ pixels exch gray_packet put
+ } for
+ pixels 0 number_pixels getinterval
+} bind def
+
+/PseudoClassPacket
+{
+ %
+ % Get a PseudoClass packet.
+ %
+ % Parameters:
+ % index: index into the colormap.
+ % length: number of pixels minus one of this color (optional).
+ %
+ currentfile byte readhexstring pop 0 get
+ /offset exch 3 mul def
+ /color_packet colormap offset 3 getinterval def
+ compression 0 gt
+ {
+ /number_pixels 3 def
+ }
+ {
+ currentfile byte readhexstring pop 0 get
+ /number_pixels exch 1 add 3 mul def
+ } ifelse
+ 0 3 number_pixels 1 sub
+ {
+ pixels exch color_packet putinterval
+ } for
+ pixels 0 number_pixels getinterval
+} bind def
+
+/PseudoClassImage
+{
+ %
+ % Display a PseudoClass image.
+ %
+ % Parameters:
+ % class: 0-PseudoClass or 1-Grayscale.
+ %
+ currentfile buffer readline pop
+ token pop /class exch def pop
+ class 0 gt
+ {
+ currentfile buffer readline pop
+ token pop /depth exch def pop
+ /grays columns 8 add depth sub depth mul 8 idiv string def
+ columns rows depth
+ [
+ columns 0 0
+ rows neg 0 rows
+ ]
+ { currentfile grays readhexstring pop } image
+ }
+ {
+ %
+ % Parameters:
+ % colors: number of colors in the colormap.
+ % colormap: red, green, blue color packets.
+ %
+ currentfile buffer readline pop
+ token pop /colors exch def pop
+ /colors colors 3 mul def
+ /colormap colors string def
+ currentfile colormap readhexstring pop pop
+ systemdict /colorimage known
+ {
+ columns rows 8
+ [
+ columns 0 0
+ rows neg 0 rows
+ ]
+ { PseudoClassPacket } false 3 colorimage
+ }
+ {
+ %
+ % No colorimage operator; convert to grayscale.
+ %
+ columns rows 8
+ [
+ columns 0 0
+ rows neg 0 rows
+ ]
+ { GrayPseudoClassPacket } image
+ } ifelse
+ } ifelse
+} bind def
+
+/DisplayImage
+{
+ %
+ % Display a DirectClass or PseudoClass image.
+ %
+ % Parameters:
+ % x & y translation.
+ % x & y scale.
+ % label pointsize.
+ % image label.
+ % image columns & rows.
+ % class: 0-DirectClass or 1-PseudoClass.
+ % compression: 0-RunlengthEncodedCompression or 1-NoCompression.
+ % hex color packets.
+ %
+ gsave
+ currentfile buffer readline pop
+ token pop /x exch def
+ token pop /y exch def pop
+ x y translate
+ currentfile buffer readline pop
+ token pop /x exch def
+ token pop /y exch def pop
+ currentfile buffer readline pop
+ token pop /pointsize exch def pop
+ /Helvetica findfont pointsize scalefont setfont
+ x y scale
+ currentfile buffer readline pop
+ token pop /columns exch def
+ token pop /rows exch def pop
+ currentfile buffer readline pop
+ token pop /class exch def pop
+ currentfile buffer readline pop
+ token pop /compression exch def pop
+ class 0 gt { PseudoClassImage } { DirectClassImage } ifelse
+ grestore
+} bind def
+%%EndProlog
+%%Page: 1 1
+%%PageBoundingBox: 0 22 377 234
+userdict begin
+%%BeginData:
+DisplayImage
+0 22
+377.000000 212.000000
+12
+757 426
+1
+0
+0
+16
+ffffff
+000000
+b24d7a
+dcadc2
+57253b
+0000ff
+d9d9d9
+c3c3c3
+bebebe
+828282
+000000
+000000
+000000
+000000
+000000
+000000
+03ff03ff03ff0311040003ff03ff03b70400031c04000301021a0400030002ff02ff02b6
+04000300021a04010301021a0400030002ff02ff02b604000300021a04010301021a0400
+030002ff02ff02b604000300021a0401030102020418030004ff04ff04b7030004170202
+040103010202040003ff03ff03e902020401030102020400030002150400030002ff02ff
+029e04000300021504000300021504000300020204010301020204000300021504000300
+02ff02ff029e040003000215040003000215040003000202040103010202040003000215
+0400030002ff02ff029e0400030002150400030002150400030002020401030102020400
+030002150400030002ff02ff029e040003000215040003000202030f0202040003000202
+0401030102020400030002150400030002ff0272000302ff022704000300021504000300
+02020300020d040002020400030002020401030102020400030002150400030002d10006
+0202000102060001020600010206000102050000020a00050225000102380001021b0004
+020d00010208000102ee0400030002150400030002020300020d04000202040003000202
+0401030102020400030002150400030002d1000102020002020100020204000202050002
+0206000202040000020900010203000102240001023800010219000102040000020c0001
+0208000102ee0400030002150400030002020300020d0400020204000300020204010301
+02020400030002150400030002d100010203000102010002020400020205000002000001
+02050002020400000208000102050001025e00010218000002070000020b000102f90400
+030002150400030002020300020d04000202040003000202040103010202040003000215
+0400030002d1000102030001020100000200000002030003020500000200000102050000
+020000010203000002030001020100010207000302040000020300030203000102000003
+020400000201000102040003020100010203000002030001020700040202000102000003
+020800040202000402040004020300000203000302010000020300040201000102000003
+020300010201000102040000020200040203000402d30400030002150400030002020300
+020d04000202040003000202040103010202040003000202030f02020400030002d10001
+020300010201000002000001020200000200000102040001020000010205000002000002
+020200000203000102010001020700010200000002040000020200010201000102020002
+020200000204000002010001020300010201000102000001020200020202000002070001
+020200010201000202020001020800010203000102020001020200010202000102020000
+020100010202000002010000020200010205000202020001020200010202000002040000
+02020000020200010201000102d7040003000208030302080400030002020300020d0400
+02020400030002020401030102020400030002020300020d040002020400030002d10001
+020200010202000002000001020200000200000102040000020200010204000002010001
+020200000207000102070001020000010202000002020001020300010201000102030001
+020200000202000102020001020300010200000002020000020000000202000002060001
+020400010200000102030001020800010202000102040001020000010204000102000000
+020200000202000102010000020100010206000102030001020200010202000102020000
+020700010201000102d704000300020803000201040002080400030002020300020d0400
+02020400030002020401030102020400030002020300020d040002020400030002d10005
+020300000201000102000000020100010203000102020001020400000202000102010000
+020700010207000102000001020200000202000102030001020100010203000102020000
+020200010202000102030001020000010201000002000000020100010206000102040001
+020000010203000102080001020200010204000102000001020400010200000002010000
+020200010202000002010001020600010203000102020001020200010202000002070001
+0201000302d504000300020803000201040002080400030002020300020d040002020400
+030002020401030102020400030002020300040e02020400030002d10001020700000201
+000102000000020100010203000102020002020300000202000202000000020700010207
+000102010000020100010202000702010001020400000201000102020001020200070200
+000102000001020000000201000002070001020400010200000102030001020800010202
+000102040001020000010204000102000000020100000201000202010001020100010206
+000102030001020200010203000002010001020400040203000302d30400030002080300
+040202080400030002020300020d04000202040003000202040103010202040003000215
+0400030002d1000102070000020100010200000002010001020300070203000002030001
+020000000207000102070001020100010200000002030001020700010204000102000000
+020300010202000102070000020000000201000102000000020700010204000102000001
+020300010208000102020001020400010200000102040001020000000201000002010000
+020000000201000002020001020600010203000102020001020300010200000002030002
+020100010205000202d20400030002150400030002020300020d04000202040003000202
+0401030102020400030002150400030002d1000102070000020200010202000102020001
+020400010203000002040002020800010205000102020001020000000203000102070001
+020400010200000002030001020200010207000002000000020200000200000002070001
+020400010200000102030001020800010202000102040001020000010204000102010000
+020000020201000202030001020600010203000102020001020300010200000002030001
+020200010206000102d20400030002150400030002020300020d04000202040003000202
+0401030102020400030002150400030002d1000102070000020200010202000102020000
+020600010202000002040002020300010203000102030001020400010205000102030000
+020100010205000102040001020300010203000002010002020200010209000102020001
+020100010203000102080001020300010202000102020001020200010202000102030000
+020700010202000002010001020300010202000102040001020400010202000102010000
+0203000102d20400030002150400030002020300020d0400020204000300020204010301
+02020400030002150400030002d100010207000002070001020100010206000102020000
+020500010203000102040005020500010207000402010001020500010204000102050004
+0201000102030001020a0004020200010203000102080001020400040204000402050003
+020900040201000102030001020200010204000102050003020000010200000502d30400
+030002150400030002020300020d04000202040003000202040103010202040003000215
+0400030002ff02ff029e0400030002150400030002020300020d04000202040003000202
+0401030102020400030002150400030002ff02ff029e0400030002150400030002020300
+040e02020400030002020401030102020400030002150400030002ff02ff029e04000300
+02150400030002150400030002020401030102020400030002150400030002ff02ff029e
+0400030002150400030002150400030002020401030102020400030002150400030002ff
+02ff029e04000300021504000300021504000300020204010300040403000416030004ff
+04ff049f030004160300041603000404030500ff00ff00e80304040003010202040000ff
+00ff00e70900030002020401030102020400000106ff06ff06e409010300020204010301
+02020400000106ff06ff06e40901030002020401030102020400000106ff06ff06e40901
+030002020401030102020400000106ff06ff06e409010300020204010301020204000001
+06ff06ff06e409010300020204010301020204000001060b01040604010006030102061f
+01000602010006040100062601040633010006020100060c010006ff06ff060201000602
+010006090102061309010300020204010301020204000001060b0100060f0100061f0100
+06020100062e01000635010106010100060c010006ff06ff0602010006020100060b0100
+061309010300020204010301020204000001060b01000606010206050100060301020618
+010006020100060201020603010206020100060201000619010006030100060001010603
+010206030102060301020618010106010100060201020603010106000100060201020603
+010206ff06f501000602010006020102060501000602010006000101060c090103000202
+04010301020204000001060b010006080100060501000602010006020100061801000600
+010006050100060201000602010006010100060201000619010006030101060101000601
+010006020100060101000602010006010100060201000617010006000100060001000601
+01000602010006010100060101010601010006020100060101000602010006ff06f40100
+060201000601010006020100060401000602010106010100060b09010300020204010301
+020204000001060b01030605010006050100060201000602010006180100060001000605
+010006020100060201000601010006000100060001000619010006030100060901000601
+010006050100060201000617010006000100060001000601010006020100060101000602
+010006010100060201000601010006ff06f8010406010100060201000604010006020100
+06020100060b09010300020204010301020204000001060b010006080100060501000602
+010406180100060001000605010006020104060101000600010006000100061901000603
+010006060103060101000605010406170100060101010601010006020100060101000602
+0100060101040602010206ff06f501000602010006010104060401000602010006020100
+060b09010300020204010301020204000001060b0100060801000605010006020100061d
+010006060100060201000605010006000100060001000619010006030100060501000602
+01000601010006050100061b010006010101060101000602010006010100060201000601
+01000609010006ff06f401000602010006010100060801000602010006020100060b0901
+0300020204010301020204000001060b0100060801000605010006020100060201000619
+010006060100060201000602010006010100060001000600010006190100060301000605
+010006020100060101000602010006010100060201000617010006020100060101000602
+010006010100060101010601010006020100060101000602010006ff06f4010006020100
+0601010006020100060401000602010106010100060b0901030002020401030102020400
+0001060b0100060801000605010006030102061a01000606010006030102060301000600
+0100061a0100060301000606010306020102060301020618010006020100060201020603
+010106000100060201020603010206ff06f5010006020100060201020605010006020100
+06000101060c0901030002020401030102020400000106ff06ff06d30100060f09010300
+020204010301020204000001060a0106062a0106062a010606ff06ff06470106060e0100
+060f09010300020204010301020204000001060a0106062a0106062a010606ff06ff0647
+0106060e0100060f0901030002020401030102020400000106ff06ff06e4090103000202
+0401030102020400000106ff06ff06e40901030002020401030102020400000106ff06ff
+06e40901030002020401030102020400000109ff09ff09e6030002020401030102020400
+000009ff09ff09e703000202040103010202040006ff06ff06e803000202040103010202
+040006ff06ff06e803000202040103010202040006ff06ff06e803000202040103010202
+040006ff06ff06e803000202040103010202040006ff06ff06e803000202040103010202
+040006ff06ff06e803000202040103010202040006ff06ff06e803000202040103010202
+040006ff06ff06e803000202040103010202040006ff06ff06e803000202040103010202
+040006ff06ff06e803000202040103010202040006ff06ff06e803000202040103010202
+040006ff06ff06e803000202040103010202040006ff06ff06e803000202040103010202
+040006ff06ff06e803000202040103010202040006ff06ff06e803000202040103010202
+040006ff06ff06e8030002020401030102020400060005ff05ff05d40912030002020401
+030102020400060005000849050108d50501089005010858050108670501085709110000
+030002020401030102020400060005000849050108d50501089005010858050108670501
+085709010706090007060001030002020401030102020400060005000849050108d50501
+089005010858050108670501085709010705000009000706000103000202040103010202
+040006000500080105030805050008060500083405010802050208270500080a05040818
+050008060500087405010801050008020500088905010800050008030500085105010801
+0503080d0500085205010802050208050500084a09010705000009010705000103000202
+0401030102020400060005000801050008020500080c0500083405010801050008020500
+08260500080a0500081c0500087c05010801050108010500088905010800050008030500
+085105010801050008020500080c05000852050108010500080205000850090107040001
+090107050001030002020401030102020400060005000801050008020500080205020803
+050108000500083405010801050008020500080105000802050008010500080005010802
+050008000501080305020802050008000501080205040808050008050500080205000801
+050008000501080305020802050408020502080305020802050008000501086605010801
+050108010500080205020802050108000500080305020875050108000501080105010802
+0502080305010800050008020502083d0501080105000802050008020502080305010800
+050008020502084c050108010500080605020802050408020502083c0901070400010600
+090107040001030002020401030102020400060005000801050008020500080405000802
+050008010501083405010801050008050500080205000801050108010500080105010801
+05000801050008020500080105010801050008030500080a050008050500080205000801
+050108010500080105000802050008030500080605000802050008020500080105010801
+050008650501080105000800050008000500080105000802050008010500080005000800
+050008010500080205000874050108000501080105010801050008020500080105000801
+05010801050008020500083c050108010500080205000801050008020500080105000801
+05010801050008020500084b05010802050008070500080605000801050008020500083b
+090107030001060109010704000103000202040103010202040006000500080105030805
+050008020500080205000834050108010500080505000802050008010500080505000805
+050008020500080105000802050008030500080a05030802050008020500080105000802
+050008010500080705000806050008020500080205000801050008020500086505010801
+050008000500080005000805050008010500080005000800050008010500080205000874
+050108000500080005010800050008010500080505000802050008010500084005010801
+05030802050008020500080105000802050008010500084f050108030501080505000805
+05000802050008020500083b090107030001060209010703000103000202040103010202
+040006000500080105000808050008020500080205000834050108010500080505000802
+0500080105000805050008050504080105000802050008030500080a0500080505000802
+050008010500080205000801050008070500080605000802050008020500080105000802
+050008650501080105000801050108020503080105000800050008000500080105040874
+050108000500080005010800050008020502080205000802050008020502083d05010801
+05000801050008020504080105000802050008020502084c050108050500080405000804
+050008030504083b09010702000106030901070300010300020204010301020204000600
+050008010500080805000802050008020500083405010801050008020500080105000802
+0500080105000805050008050500080505000802050008030500080a0500080505000802
+050008010500080205000801050008070500080605000802050008020500080105000802
+050008650501080105000801050108010500080205000801050008000500080005000801
+050008780501080005000803050008050500080105000802050008050500083c05010801
+05000802050008010500080505000802050008050500084b050108010500080205000804
+05000803050008040500083f090107020001060409010702000103000202040103010202
+040006000500080105000808050008020500080105010834050108010500080205000801
+05000801050108010500080505000805050008020500080105000802050008030500080a
+050008050500080105010801050008020500080105000802050008030500080605000802
+050008020500080105000802050008650501080105000802050008010500080205000801
+050008000500080005000801050008020500087405010800050008030500080105000802
+050008010500080105010801050008020500083c05010801050008020500080105000802
+050008010500080105010801050008020500084b05010801050008020500080405000802
+05000805050008020500083b090107010001060509010702000103000202040103010202
+040006000500080105000808050008030501080005000834050108020502080305010800
+050008010500080505000806050208020500080205000804050108080500080605010800
+050008010500080205000802050208050501080405000803050208020500080205000865
+050108010500080205000802050308010500080005000800050008020502087505010800
+05000803050008020502080305010800050008020502083d050108010500080205000802
+0502080305010800050008020502084c050108020502080505000802050408020502083c
+0901070100010606090107010001030002020401030102020400060005000849050108d5
+050108900501081305000843050108670501085709010700000106070901070100010300
+02020401030102020400060005000849050108d5050108900501080f0500080205000843
+050108670501085709010700000106080901070000010300020204010301020204000600
+05000849050108d5050108900501081005020844050108670501085709010001090b0700
+0001030002020401030102020400060005000849050108d5050108900501085805010867
+0501085709010000090d0001030002020401030102020400060005000849050108d50501
+08900501085805010867050108570901070e000103000202040103010202040006000500
+0849050108d5050108900501085805010867050108570901001003000202040103010202
+0400060005000849050108d5050108900501085805010867050108570901000d09000001
+030002020401030102020400060005ff05ff05d409010001060a09010001030002020401
+030102020400060001ff01ff01d409010001060a09010001030002020401030102020400
+060001000849010108d50101089001010858010108670101085709010001060a09010001
+030002020401030102020400060001000849010108d50101089001010858010108670101
+085709010001060a09010001030002020401030102020400060001000805010008230100
+081d010108440100088f0101089001010858010108670101085709010001060a09010001
+030002020401030102020400060001000804010008040101080b0101080b010108020100
+081c010108040100080c010008040100080b0102081b010008030100088a010108040100
+080c01000804010008760101080301010852010108020102080301020806010008520101
+080201020803010208020104084209010001060a09010001030002020401030102020400
+060001000803010008040100080101000809010008010100080901000801010008020100
+081b010108180100080d0100081a010008030101088a0101081801000876010108020100
+080101000851010108010100080201000801010008020100080401010852010108010100
+0802010008010100080201000801010008020100084209010001060a0901000103000202
+040103010202040006000100080201000805010008010100080901000801010008090100
+0801010008030100081a0101080201020802010008000101080301020802010408030101
+0805010008030102080301020802010008000101080501000802010008000100088a0101
+080201020802010008000101080301020802010408740101080201000801010008510101
+080101000802010008010100080701000800010008520101080101000805010008020100
+08050100084209010001060a090100010300020204010301020204000600010008010100
+080601000801010008090100080101000809010008010100080401000819010108040100
+080201010801010008040100080401000805010108050100080201000802010008010100
+0802010008010101080101000803010008050100088a0101080401000802010108010100
+080401000804010008760101080201000801010008510101080101000802010008010100
+08060100080101000852010108010100080501000802010008040100084309010001060a
+090100010300020204010301020204000600010008000100080701000801010008090100
+080101000809010008010100080501000818010108040100080201000802010008040100
+08040100080d010008020100080201000801010008020100080101000802010008030100
+08050100088a010108040100080201000802010008040100080401000876010108020100
+080101000851010108020103080101030802010008020100085201010801010308030103
+08040100084309010001060a090100010300020204010301020204000600010008010100
+080601000801010008090100080101000809010008010100080401000819010108040100
+08020100080201000804010008040100080d010008020100080201000801010008020100
+08010100080201000802010008060100088a010108040100080201000802010008040100
+080401000876010108020100080101000851010108050100080101000802010008010100
+080201000852010108010100080201000805010008040100084309010001060a09010001
+030002020401030102020400060001000802010008050100080101000809010008010100
+080901000801010008030100081a01010804010008020100080201000804010008040100
+080d01000802010008020100080101000802010008010100080201000802010008060100
+088a01010804010008020100080201000804010008040100087601010802010008010100
+085101010805010008010100080201000801010508510101080101000802010008050100
+08030100084409010001060a090100010300020204010301020204000600010008030100
+080401000801010008030101080301000801010008030101080301000801010008020100
+081b01010804010008020100080201000804010008040100080501010805010008020100
+08020100080101000802010008010101080101000801010008070100088a010108040100
+080201000802010008040100080401000876010108020100080101000851010108010100
+080201000801010008020100080501000852010108010100080201000801010008020100
+08030100084409010001060a090100010300020204010301020204000600010008040100
+080401010804010108040101080401010804010108020100081c01010804010008020100
+080201000804010008050101080301010805010008030102080301020802010008000101
+080201000805010408880101080401000802010008020100080401000805010108740101
+080301010852010108020102080301020806010008520101080201020803010208040100
+084409010001060a09010001030002020401030102020400060001000805010008230100
+081d010108390100089a0101089001010858010108670101085709010001060a09010001
+030002020401030102020400060001000849010108390100089a01010890010108580101
+08670101085709010001060a090100010300020204010301020204000600010008490101
+08390100089a0101089001010858010108670101085709010001060a0901000103000202
+0401030102020400060001000849010108d5010108900101085801010867010108570901
+0001060a09010001030002020401030102020400060001000849010108d5010108900101
+0858010108670101085709010001060a0901000103000202040103010202040006000100
+0849010108d50101089001010858010108670101085709010001060a0901000103000202
+0401030102020400060001000849010108d5010108900101085801010867010108570901
+0001060a09010001030002020401030102020400060001ff01ff01d409010001060a0901
+0001030002020401030102020400060001ff01ff01d409010001060a0901000103000202
+0401030102020400060001000849010108d5010108900101085801010867010108570901
+0001060a09010001030002020401030102020400060001000849010108d5010108900101
+0858010108670101085709010001060a0901000103000202040103010202040006000100
+0805010008230100081d0101089101000842010108900101085801010867010108570901
+0001060a09010001030002020401030102020400060001000804010008040101080a0102
+080b010108020100081c010108100102081a0100081101020814010008170102081b0100
+08010104083b010108100102081a01000811010208140100083501010803010108520101
+08020102080301020803010208030102084c010108030100080401020803010208060100
+083b09010001060a09010001030002020401030102020400060001000803010008040100
+080101000808010008020100080901000801010008020100081b010108120100082f0100
+0814010008190100081a010008020100083f010108120100082f01000814010008350101
+080201000801010008510101080101000802010008010100080201000801010008020100
+0801010008020100084b0101080201010803010008020100080101000802010008040101
+083b09010001060a09010001030002020401030102020400060001000802010008050100
+08010100080c0100080901000801010008030100081a0101080201020802010008000101
+0805010008090100080001010802010008000101080301020802010108000100080c0100
+080301020803010208030101080001000802010208020100080001010804010108050100
+080301020803010208020100080001010805010008020100083f01010802010208020100
+080001010805010008090100080001010802010008000101080301020802010108000100
+080c01000803010208030102080301010800010008020102080201000800010108280101
+0802010008010100085101010801010008020100080101000809010008050100084b0101
+08010100080001000803010008050100080201000803010008000100083b09010001060a
+0901000103000202040103010202040006000100080101000806010008010100080c0100
+080901000801010008040100081901010801010008020100080101010801010008040100
+0809010108010100080101010801010008040100080201000800010008000100080b0100
+080201000802010008010100080201000801010008010101080101000802010008010101
+080101000803010108050100080201000802010008010100080201000801010108010100
+0803010008030103083c0101080101000802010008010101080101000804010008090101
+08010100080101010801010008040100080201000800010008000100080b010008020100
+080201000801010008020100080101000801010108010100080201000801010108010100
+082701010802010008010100085101010801010008020100080101000809010008050100
+084b0101080301000803010008050100080201000802010008010100083b09010001060a
+0901000103000202040103010202040006000100080001000807010008010100080b0100
+080a01000801010008050100081801010801010008020100080101000808010008090100
+080201000801010008080100080201000800010008000100080b01000802010008020100
+080501000801010008020100080101000802010008010100080f01000802010008020100
+080101000802010008010100080201000803010008070100083b01010801010008020100
+080101000808010008090100080201000801010008080100080201000800010008000100
+080b01000802010008020100080501000801010008020100080101000802010008010100
+082b010108020100080101000851010108020102080201030805010008050100084c0101
+0803010008030103080301020802010008020100083b09010001060a0901000103000202
+040103010202040006000100080101000806010008010100080a0100080b010008010100
+080401000819010108010104080101000808010008090100080201000801010008080100
+080201000800010008000100080b01000802010008020100080201030801010008020100
+0801010408010100080f0100080201000802010008010100080201000801010008020100
+0802010008080100083b0101080101040801010008080100080901000802010008010100
+08080100080201000800010008000100080b010008020100080201000802010308010100
+080201000801010408010100082b01010802010008010100085101010801010008020100
+08010100080201000803010008050100084d010108030100080301000802010008010100
+080201000801010008020100083b09010001060a09010001030002020401030102020400
+0600010008020100080501000801010008090100080c01000801010008030100081a0101
+080101000805010008080100080901000802010008010100080801000802010008000100
+08000100080b010008020100080201000801010008020100080101000802010008010100
+08050100080f010008020100080201000801010008020100080101000802010008020100
+0804010008020100083b0101080101000805010008080100080901000802010008010100
+08080100080201000800010008000100080b010008020100080201000801010008020100
+08010100080201000801010008050100082b010108020100080101000851010108010100
+0802010008010100080201000802010008050100084e0101080301000803010008020100
+080101000802010008010105083a09010001060a09010001030002020401030102020400
+060001000803010008040100080101000803010108020100080701010803010008010100
+08020100081b010108010100080201000801010008080100080901010801010008010100
+08080100080201000800010008000100080b010008020100080201000801010008020100
+080101000801010108010100080201000801010008070101080501000802010008020100
+08010100080201000801010108010100080101000805010008020100083b010108010100
+080201000801010008080100080901010801010008010100080801000802010008000100
+08000100080b010008020100080201000801010008020100080101000801010108010100
+0802010008010100082b0101080201000801010008510101080101000802010008010100
+080201000801010008050100084f01010803010008030100080201000801010008020100
+08050100083b09010001060a090100010300020204010301020204000600010008040100
+080401010804010108020104080301010804010108020100081c01010802010208020100
+0808010008090100080001010802010008080100080201000800010008000100080b0100
+080301020803010308020101080001000802010208020100080701010805010008030102
+0803010208020100080001010802010008060102083c0101080201020802010008080100
+08090100080001010802010008080100080201000800010008000100080b010008030102
+0803010308020101080001000802010208020100082b0101080301010852010108020102
+080301020802010408010104084b010108010104080201020803010208060100083b0901
+0001060a09010001030002020401030102020400060001000805010008230100081d0101
+08150105080101000819010508470100084d010108150105080101000819010508510101
+0858010108670101085709010001060a0901000103000202040103010202040006000100
+08490101081d010008670100084d0101081d010008710101085801010867010108570901
+0001060a090100010300020204010301020204000600010008490101081d010008670100
+084d0101081d0100087101010858010108670101085709010001060a0901000103000202
+0401030102020400060001000849010108d5010108900101085801010867010108570901
+0001060a09010001030002020401030102020400060001000849010108d5010108900101
+0858010108670101085709010001060a0901000103000202040103010202040006000100
+0849010108d50101089001010858010108670101085709010001060a0901000103000202
+0401030102020400060001000849010108d5010108900101085801010867010108570901
+0001060a09010001030002020401030102020400060001ff01ff01d409010001060a0901
+0001030002020401030102020400060001ff01ff01d409010001060a0901000103000202
+0401030102020400060001000849010108d5010108900101085801010867010108570901
+0001060a09010001030002020401030102020400060001000849010108d5010108900101
+0858010108670101085709010001060a0901000103000202040103010202040006000100
+0805010008230100081d010108670100086c010108900101085801010867010108570901
+0001060a09010001030002020401030102020400060001000804010008040101080d0100
+080a010108020100081c0101083b0100080b0102081b01000805010008650101082c0102
+086001010803010108520101080301000804010208030102085301010801010408030100
+08040102084309010001060a090100010300020204010301020204000600010008030100
+0804010008010100080b0101080901000801010008020100081b0101083b0100080d0100
+081a01000805010108650101082e01000860010108020100080101000851010108020101
+080301000802010008010100080201000852010108010100080601010803010008020100
+084209010001060a09010001030002020401030102020400060001000802010008050100
+08010100080a010008000100080901000801010008030100081a01010802010108000100
+080201020802010008000101080a01020802010008020100080201020802010008000101
+080201040803010108050100080301020803010208020100080001010805010008040100
+080001000865010108020102080201000800010108020100080001010803010208020100
+08000101080c010008030102080301010800010008020101080001000802010208020100
+08000101083d010108020100080101000851010108010100080001000803010008090100
+085201010801010008050100080001000803010008020100084209010001060a09010001
+030002020401030102020400060001000801010008060100080101000809010008010100
+080901000801010008040100081901010801010008010101080101000802010008010101
+080101000808010008020100080101000802010008010100080201000801010108010100
+080301000805010108050100080201000802010008010100080201000801010108010100
+080301000804010008010100086501010801010008020100080101010801010008010101
+0801010008010100080201000801010108010100080b0100080201000802010008010100
+08010101080101000801010108010100080201000801010108010100083c010108020100
+080101000851010108030100080301000809010008520101080101030804010008030100
+08020100084209010001060a090100010300020204010301020204000600010008000100
+080701000801010008080100080201000809010008010100080501000818010108010100
+080201000801010008020100080101000802010008080100080201000801010008020100
+0801010008020100080101000802010008030100080d0100080201000802010008010100
+080201000801010008020100080301000803010008020100086501010801010008020100
+0801010008050100080501000802010008010100080f0100080201000802010008010100
+080201000801010008020100080101000802010008010100084001010802010008010100
+085101010803010008030103080501000853010108050100080301000804010308420901
+0001060a0901000103000202040103010202040006000100080101000806010008010100
+080801000802010008090100080101000804010008190101080101000802010008010104
+080101000802010008080104080201000800010008020104080101000802010008030100
+080d01000802010008020100080101000802010008010100080201000802010008040100
+0802010008650101080101040801010008050100080501000802010008010100080f0100
+080201000802010008010100080201000801010008020100080101040801010008400101
+080201000801010008510101080301000803010008020100080301000854010108050100
+0803010008070100084209010001060a0901000103000202040103010202040006000100
+08020100080501000801010008080105080801000801010008030100081a010108010100
+080201000801010008050100080201000808010008060100080001000802010008050100
+0802010008030100080d0100080201000802010008010100080201000801010008020100
+080201000804010508640101080101000805010008050100080501000802010008010100
+080f01000802010008020100080101000802010008010100080201000801010008050100
+084001010802010008010100085101010803010008030100080201000802010008550101
+08010100080201000803010008070100084209010001060a090100010300020204010301
+020204000600010008030100080401000801010008030101080601000803010108030100
+0801010008020100081b0101080101000801010108010100080201000801010008020100
+080801000802010008030100080301000802010008010100080201000803010008050101
+080501000802010008020100080101000802010008010101080101000801010008090100
+0865010108010100080201000801010008050100080501000802010008010100080f0100
+080201000802010008010100080101010801010008010101080101000802010008010100
+084001010802010008010100085101010803010008030100080201000801010008560101
+0801010008020100080301000803010008020100084209010001060a0901000103000202
+040103010202040006000100080401000804010108040101080601000803010108040101
+08020100081c010108020101080001000802010208020100080201000809010208040100
+080401020802010008020100080401010803010108050100080301020803010208020100
+080001010802010008090100086501010802010208020100080501000806010208020100
+080f01000803010208030101080001000802010108000100080201020802010008400101
+080301010852010108010104080201020802010408520101080201020802010408020102
+084309010001060a09010001030002020401030102020400060001000805010008230100
+081d010108050100080e01050840010008770101082301050813010008050100084a0101
+0858010108670101085709010001060a0901000103000202040103010202040006000100
+084901010801010008020100085501000877010108390100080201000801010008020100
+084a01010858010108670101085709010001060a09010001030002020401030102020400
+0600010008490101080201020856010008770101083a010208030102084b010108580101
+08670101085709010001060a090100010300020204010301020204000600010008490101
+08d50101089001010858010108670101085709010001060a090100010300020204010301
+02020400060001000849010108d50101089001010858010108670101085709010001060a
+09010001030002020401030102020400060001000849010108d501010890010108580101
+08670101085709010001060a090100010300020204010301020204000600010008490101
+08d50101089001010858010108670101085709010001060a090100010300020204010301
+02020400060001ff01ff01d409010001060a090100010300020204010301020204000600
+00ff00ff00d409010001060a090100010300020204010301020204000600000008490001
+08d50001089000010858000108670001085709010001060a090100010300020204010301
+02020400060000000849000108d50001089000010858000108670001085709010001060a
+09010001030002020401030102020400060000000805000008230000081d0001086e0000
+08650001089000010858000108670001085709010001060a090100010300020204010301
+0202040006000000080400000804000108090004080a000108020000081c0001084f0002
+081b000008020002085f000108170002080500000812000008060000082e000008120002
+080300020805000108030001085200010805000008020002080400010853000108030000
+080400020803000208060000083b09010001060a09010001030002020401030102020400
+0600000008030000080400000801000008080000080d00000801000008020000081b0001
+08510000081a00000802000008020000085e000108190000081900000836000008140000
+080500000805000108020000080100000851000108040001080100000802000008020000
+0801000008520001080200010803000008020000080100000802000008040001083b0901
+0001060a0901000103000202040103010202040006000000080200000805000008010000
+08080000080d00000801000008030000081a000108020001080000000802000208020000
+08000001080a000208030002080200000800000108020000080200000802000208020000
+080000010804000108050000080300020803000208020000080000010805000008020000
+086200010802000208020000080000010802000008000001080500000803000208030002
+080300020802000408020002080300020802000008000001080a00020803000208020000
+080000010802000408010000080000010803000208050000080500000803000308020000
+080100000851000108030000080000000805000008020000080100000852000108010000
+080000000803000008050000080200000803000008000000083b09010001060a09010001
+0300020204010301020204000600000008010000080600000801000008080003080a0000
+080100000804000008190001080100000801000108010000080200000801000108010000
+080800000802000008010000080200000801000108010000080100000802000008010000
+080200000801000108010000080300010805000008020000080200000801000008020000
+080100010801000008030000080300000862000108010000080200000801000108010000
+080100010801000008040000080500000802000008020000080100000802000008030000
+080600000802000008020000080100010801000008080000080200000801000008020000
+080100010801000008030000080300010801000008010000080200000804000008050000
+080200000801000108020000080100000851000108020000080100000805000008020000
+0801000008520001080300000803000008050000080200000802000008010000083b0901
+0001060a0901000103000202040103010202040006000000080000000807000008010000
+080c00000809000008010000080500000818000108010000080200000801000008020000
+080100000802000008080000080500000802000008010000080500000802000008010000
+0802000008010000080f0000080200000802000008010000080200000801000008020000
+0803000008030003085f0001080500000801000008020000080100000802000008040000
+080500000802000008090000080300000806000008020000080200000801000008020000
+080800000805000008020000080100000802000008030000080300000805000008020000
+080400000805000008020000080100010802000008010000085100010801000008020000
+080300010803000008010000085200010803000008030003080300020802000008020000
+083b09010001060a09010001030002020401030102020400060000000801000008060000
+08010000080c000008090000080100000804000008190001080100000802000008010004
+080100000802000008090002080200040801000008060000080000000802000408010000
+080f00000802000008020000080100000802000008010000080200000802000008040000
+08020000085e000108020003080100000802000008010000080200000804000008050000
+080200000806000308030000080600000802000008020000080100000802000008080000
+080500000802000008010000080200000803000008030000080500000802000008040000
+080500000802000408020000080100000851000108010000080200000805000008020000
+080100000852000108030000080300000802000008010000080200000801000008020000
+083b09010001060a09010001030002020401030102020400060000000802000008050000
+080100000808000008020000080900000801000008030000081a00010801000008020000
+080100000805000008020000080c00000801000008050000080600000800000008020000
+08050000080f000008020000080200000801000008020000080100000802000008020000
+0804000008020000085e0001080100000802000008010000080200000801000008020000
+080400000805000008020000080500000802000008030000080600000802000008020000
+080100000802000008080000080500000802000008010000080200000803000008030000
+080500000802000008040000080500000802000008010001080200000801000008510001
+080100050804000008020000080100000852000108030000080300000802000008010000
+0802000008010005083a09010001060a0901000103000202040103010202040006000000
+080300000804000008010000080300010802000008020000080300010803000008010000
+08020000081b000108010000080100010801000008020000080100000802000008080000
+080200000801000008020000080100000807000008030000080200000801000008070001
+080500000802000008020000080100000802000008010001080100000801000008050000
+08020000085e000108010000080200000801000108010000080100010801000008040000
+080500000802000008020000080100000802000008030000080600000802000008020000
+080100000802000008080000080200000801000008020000080100000802000008030000
+080300000805000008020000080400000805000008020000080100010802000008010000
+085100010805000008010000080200000802000008010000085200010803000008030000
+08020000080100000802000008050000083b09010001060a090100010300020204010301
+020204000600000008040000080400010804000108030002080400010804000108020000
+081c00010802000108000000080200020802000008020000080900020803000208020000
+080700000804000208020000080700010805000008030002080300020802000008000001
+0802000008060002085f0001080200030801000008000001080200000800000108050000
+080500000803000208030003080400010804000008030002080200000802000008090002
+080300020802000008020000080400010801000008060002080500000805000008030003
+080300010852000108050000080200020804000108530001080100040802000208030002
+08060000083b09010001060a090100010300020204010301020204000600000008050000
+08230000081d000108050000080e000508470000087000010808000008050000083c0005
+083c00010858000108670001085709010001060a09010001030002020401030102020400
+06000000084900010801000008020000085c0000087000010808000008050000087f0001
+0858000108670001085709010001060a0901000103000202040103010202040006000000
+0849000108020002085d0000087000010808000008050000087f00010858000108670001
+085709010001060a09010001030002020401030102020400060000000849000108d50001
+089000010858000108670001085709010001060a09010001030002020401030102020400
+060000000849000108d50001089000010858000108670001085709010001060a09010001
+030002020401030102020400060000000849000108d50001089000010858000108670001
+085709010001060a09010001030002020401030102020400060000000849000108d50001
+089000010858000108670001085709010001060a09010001030002020401030102020400
+060000ff00ff00d409010001060a09010001030002020401030102020400060001ff01ff
+01d409010001060a09010001030002020401030102020400060001000849010108d50101
+089001010858010108670101085709010001060a09010001030002020401030102020400
+060001000849010108d50101089001010858010108670101085709010001060a09010001
+030002020401030102020400060001000805010008230100081d010108c90100080a0101
+089001010858010108670101085709010001060a09010001030002020401030102020400
+060001000804010008040101080a0102080b010108020100081c01010817010208050100
+0812010008060100082e01000829010008110102081b0100080201020804010108900101
+08030101085201010803010008040102085a010108020102080301020804010108430901
+0001060a0901000103000202040103010202040006000100080301000804010008010100
+0808010008020100080901000801010008020100081b0101081901000819010008360100
+083e0100081a010008020100080201000803010108900101080201000801010008510101
+080201010803010008020100085901010801010008020100080101000802010008020100
+08010100084209010001060a090100010300020204010301020204000600010008020100
+080501000801010008080100080d01000801010008030100081a01010802010208020100
+080001010802010008000101080501000803010208030102080301020802010408020102
+080301020802010008000101080901010800010008030102080301020802010408020102
+080201000800010108040101080201010800010008030102080301020802010008000101
+080c01000803010208030102080201000800010108050100080601000803010108900101
+080201000801010008510101080101000800010008070100085901010805010008050100
+0802010008010100084209010001060a0901000103000202040103010202040006000100
+08010100080601000801010008080100080d010008010100080401000819010108010100
+080201000801010108010100080101010801010008040100080501000802010008020100
+080101000802010008030100080601000802010008020100080101010801010008080100
+080001000800010008010100080201000801010008020100080301000803010008020100
+080101010801010008030101080201000800010008000100080101000802010008040100
+0802010108010100080b0100080201000802010008010100080201000801010108010100
+080301000807010008030101089001010802010008010100085101010803010008070100
+0859010108050100080501000802010008010100084209010001060a0901000103000202
+04010301020204000600010008000100080701000801010008080103080a010008010100
+080501000818010108050100080101000802010008010100080201000804010008050100
+080201000809010008030100080601000802010008020100080101000802010008080100
+0800010008000100080501000801010008070100080301000802010008010100080c0100
+080001000800010008050100080401000802010008020100080b01000802010008020100
+080101000802010008010100080201000803010008060100080401010890010108020100
+08010100085101010803010008060100085a010108030101080501000803010008010100
+084209010001060a09010001030002020401030102020400060001000801010008060100
+080101000808010008020100080901000801010008040100081901010802010308010100
+080201000801010008020100080401000805010008020100080601030803010008060100
+080201000802010008010100080201000808010008000100080001000802010308020102
+080401000803010408010100080c01000800010008000100080201030804010008020100
+08020100080b010008020100080201000801010008020100080101000802010008020100
+0806010008050101089001010802010008010100085101010803010008050100085b0101
+08050100080301000804010008010100084209010001060a090100010300020204010301
+020204000600010008020100080501000801010008080100080201000809010008010100
+08030100081a010108010100080201000801010008020100080101000802010008040100
+080501000802010008050100080201000803010008060100080201000802010008010100
+080201000808010008000100080001000801010008020100080501000803010008030100
+08050100080c010008000100080001000801010008020100080401000802010008020100
+080b01000802010008020100080101000802010008010100080201000802010008050100
+08060101089001010802010008010100085101010803010008040100085c010108050100
+080201000805010008010100084209010001060a09010001030002020401030102020400
+060001000803010008040100080101000803010108020100080201000803010108030100
+0801010008020100081b0101080101000802010008010101080101000801010108010100
+080401000805010008020100080201000801010008020100080301000806010008020100
+080201000801010008020100080801000800010008000100080101000802010008010100
+080201000803010008030100080201000801010008070101080201000800010008000100
+0801010008020100080401000802010008020100080b0100080201000802010008010100
+080201000801010108010100080101000805010008070101089001010802010008010100
+085101010803010008030100085d01010801010008020100080101000806010008010100
+084209010001060a09010001030002020401030102020400060001000804010008040101
+0804010108030102080401010804010108020100081c0101080201030801010008000101
+080201000800010108050100080501000803010208030103080401010804010008030102
+080201000802010008080100080001000800010008020103080201020805010108020102
+080201000807010108020100080001000800010008020103080401000802010008020100
+080b01000803010208030102080201000800010108020100080501040803010108900101
+080301010852010108010104080101040859010108020102080201040803010108430901
+0001060a09010001030002020401030102020400060001000805010008230100081d0101
+0808010008050100083c0105084d01050816010008150101089001010858010108670101
+085709010001060a09010001030002020401030102020400060001000849010108080100
+0805010008ad010008150101089001010858010108670101085709010001060a09010001
+0300020204010301020204000600010008490101080801000805010008ad010008150101
+089001010858010108670101085709010001060a09010001030002020401030102020400
+060001000849010108d50101089001010858010108670101085709010001060a09010001
+030002020401030102020400060001000849010108d50101089001010858010108670101
+085709010001060a09010001030002020401030102020400060001000849010108d50101
+089001010858010108670101085709010001060a09010001030002020401030102020400
+060001000849010108d50101089001010858010108670101085709010001060a09010001
+030002020401030102020400060001ff01ff01d409010001060a09010001030002020401
+030102020400060001ff01ff01d409010001060a09010001030002020401030102020400
+060001000849010108d50101089001010858010108670101085709010001060a09010001
+030002020401030102020400060001000849010108d50101089001010858010108670101
+085709010001060a09010001030002020401030102020400060001000805010008230100
+081d010108bb010008180101089001010858010108670101085709010001060a09010001
+03000202040103010202040006000100080401000804010108090104080a010108020100
+081c010108170102080501000812010008060100082e0100081901020821010008040100
+0807010008050100081101010890010108030101085201010805010008020102085a0101
+080201020803010208030102084309010001060a09010001030002020401030102020400
+060001000803010008040100080101000808010008020100080901000801010008020100
+081b0101081901000819010008360100081b010008270100080601000805010108110101
+089001010802010008010100085101010804010108010100080201000859010108010100
+0802010008010100080201000801010008020100084209010001060a0901000103000202
+040103010202040006000100080201000805010008010100080c01000809010008010100
+08030100081a010108020102080201000800010108020100080001010805010008030102
+080301020803010208020104080201020803010208020100080001010809010108000100
+080301020803010208020104080201020802010008000101080401010805010008030102
+080301020802010008000101080a01020802010408040100080401000800010008110101
+089001010802010008010100085101010803010008000100080501000859010108050100
+080101000802010008010100084609010001060a09010001030002020401030102020400
+06000100080101000806010008010100080b0100080a0100080101000804010008190101
+080101000802010008010101080101000801010108010100080401000805010008020100
+080201000801010008020100080301000806010008020100080201000801010108010100
+080801000800010008000100080101000802010008010100080201000803010008030100
+080201000801010108010100080301010805010008020100080201000801010008020100
+0801010108010100080b0100080401000805010008040100080101000811010108900101
+080201000801010008510101080201000801010008050100085901010805010008010100
+0802010008010100084609010001090c0001030002020401030102020400060001000800
+01000807010008010100080b0100080a0100080101000805010008180101080501000801
+010008020100080101000802010008040100080501000802010008090100080301000806
+010008020100080201000801010008020100080801000800010008000100080501000801
+010008070100080301000802010008010100080f01000802010008020100080101000802
+01000801010008020100080b010008040100080501000803010008020100081101010890
+0101080201000801010008510101080101000802010008040100085a0101080401000803
+010208020103084309010000090d00010300020204010301020204000600010008010100
+0806010008010100080b0100080a01000801010008040100081901010802010308010100
+080201000801010008020100080401000805010008020100080601030803010008060100
+080201000802010008010100080201000808010008000100080001000802010308020102
+080401000803010408010100080f01000802010008020100080101000802010008010100
+08020100080b010008040100080401000804010008020100081101010890010108020100
+0801010008510101080101000802010008030100085b0101080301000803010008020100
+080101000802010008420901070e00010300020204010301020204000600010008020100
+0805010008010100080a0100080b01000801010008030100081a01010801010008020100
+080101000802010008010100080201000804010008050100080201000805010008020100
+080301000806010008020100080201000801010008020100080801000800010008000100
+080101000802010008050100080301000803010008050100080f01000802010008020100
+08010100080201000801010008020100080b010008040100080401000804010508100101
+089001010802010008010100085101010801010508010100085c01010802010008040100
+08020100080101000802010008420901070e000103000202040103010202040006000100
+080301000804010008010100080301010804010008050101080301000801010008020100
+081b01010801010008020100080101010801010008010101080101000804010008050100
+080201000802010008010100080201000803010008060100080201000802010008010100
+080201000808010008000100080001000801010008020100080101000802010008030100
+080301000802010008010100080701010805010008020100080201000801010008020100
+0801010108010100080b0100080401000803010008090100081101010890010108020100
+08010100085101010805010008010100085d010108010100080501000802010008010100
+0802010008420901070e0001030002020401030102020400060001000804010008040101
+0804010108040100080501010804010108020100081c0101080201030801010008000101
+080201000800010108050100080501000803010208030103080401010804010008030102
+080201000802010008080100080001000800010008020103080201020805010108020102
+08020100080701010805010008030102080301020802010008000101080c010008050101
+080101000809010008110101089001010803010108520101080501000801010408590101
+08010104080201020803010208430901070e000103000202040103010202040006000100
+0805010008230100081d01010808010008050100083c01050847010008040105082d0101
+08900101085801010867010108570901070e000103000202040103010202040006000100
+084901010808010008050100088a01000838010108900101085801010867010108570901
+070e000103000202040103010202040006000100084901010808010008050100088a0100
+0838010108900101085801010867010108570901070e0001030002020401030102020400
+060001000849010108d5010108900101085801010867010108570901070e000103000202
+0401030102020400060001000849010108d5010108900101085801010867010108570901
+070e0001030002020401030102020400060001000849010108d501010890010108580101
+0867010108570901070e0001030002020401030102020400060001000849010108d50101
+08900101085801010867010108570901070e0001030002020401030102020400060001ff
+01ff01d40901070e0001030002020401030102020400060001ff01ff01d40901070e0001
+030002020401030102020400060001000849010108d50101089001010858010108670101
+08570901070e0001030002020401030102020400060001000849010108d5010108900101
+085801010867010108570901070e00010300020204010301020204000600010008050100
+08230100081d0101086e01000865010108900101085801010867010108570901070e0001
+030002020401030102020400060001000804010008040101080a0102080b010108020100
+081c0101084f0102081b010008020102085f010108010100082201020867010108030101
+085201010801010408030101080601000852010108030100080401020803010208060100
+083b0901070e000103000202040103010202040006000100080301000804010008010100
+0808010008020100080901000801010008020100081b010108510100081a010008020100
+08020100085e010108010100082401000867010108020100080101000851010108010100
+080601000801010008040101085201010802010108030100080201000801010008020100
+08040101083b0901070e0001030002020401030102020400060001000802010008050100
+080101000808010008020100080901000801010008030100081a01010802010108000100
+080201020802010008000101080a01020803010208020100080001010802010008020100
+080201020802010008000101080401010805010008030102080301020802010008000101
+080501000802010008620101080101000801010008030102080201000800010108020100
+080001010803010208050100080a010208020100080201000801010008000101084b0101
+080201000801010008510101080101000806010008010100080301000800010008520101
+08010100080001000803010008050100080201000803010008000100083b0901070e0001
+030002020401030102020400060001000801010008060100080101000808010008020100
+080901000801010008040100081901010801010008010101080101000802010008010101
+080101000808010008020100080101000802010008010101080101000801010008020100
+080101000802010008010101080101000803010108050100080201000802010008010100
+080201000801010108010100080301000803010008620101080101000800010008030100
+080201000801010108010100080101010801010008010100080201000804010008090100
+0802010008010100080201000801010108010100084a0101080201000801010008510101
+080101030803010008010100080201000801010008520101080301000803010008050100
+080201000802010008010100083b0901070e000103000202040103010202040006000100
+08000100080701000801010008090102080a010008010100080501000818010108010100
+080201000801010008020100080101000802010008080100080501000802010008010100
+0805010008020100080101000802010008010100080f0100080201000802010008010100
+0802010008010100080201000803010008030103085f0101080101010804010008020100
+080101000805010008020100080101000802010008040100080901000805010008020100
+0801010008020100084a0101080201000801010008510101080501000802010008010100
+0801010008020100085201010803010008030103080301020802010008020100083b0901
+070e00010300020204010301020204000600010008010100080601000801010008080100
+080201000809010008010100080401000819010108010100080201000801010408010100
+0802010008090102080201040801010008060100080001000802010408010100080f0100
+080201000802010008010100080201000801010008020100080201000804010008020100
+085e010108010101080401040801010008050100080201000801010408040100080a0102
+08020100080201000801010008020100084a010108020100080101000851010108050100
+080201000801010008010100080201000852010108030100080301000802010008010100
+080201000801010008020100083b0901070e000103000202040103010202040006000100
+0802010008050100080101000808010008020100080901000801010008030100081a0101
+0801010008020100080101000805010008020100080c0100080101000805010008060100
+080001000802010008050100080f01000802010008020100080101000802010008010100
+08020100080201000804010008020100085e010108010100080001000803010008050100
+08050100080201000801010008080100080d010008010100080201000801010008020100
+084a01010802010008010100085101010801010008020100080201000801010008010105
+08510101080301000803010008020100080101000802010008010105083a0901070e0001
+030002020401030102020400060001000803010008040100080101000803010108020100
+0802010008030101080301000801010008020100081b0101080101000801010108010100
+080201000801010008020100080801000802010008010100080201000801010008070100
+080301000802010008010100080701010805010008020100080201000801010008020100
+0801010108010100080101000805010008020100085e0101080101000801010008020100
+080201000801010008050100080201000801010008020100080401000809010008020100
+08010100080101010801010108010100084a010108020100080101000851010108010100
+080201000802010008010100080501000852010108030100080301000802010008010100
+0802010008050100083b0901070e00010300020204010301020204000600010008040100
+080401010804010108030102080401010804010108020100081c01010802010108000100
+080201020802010008020100080901020803010208020100080701000804010208020100
+0807010108050100080301020803010208020100080001010802010008060102085f0101
+0801010008020100080201020802010008050100080201000802010208050100080a0102
+08030101080001000801010008000101084b010108030101085201010802010208040101
+080601000852010108010104080201020803010208060100083b0901070e000103000202
+0401030102020400060001000805010008230100081d010108050100080e010508470100
+08700101082a0105080f0100084e0101085801010867010108570901070e000103000202
+040103010202040006000100084901010801010008020100085c01000870010108400100
+084e0101085801010867010108570901070e000103000202040103010202040006000100
+0849010108020102085d01000870010108400100084e0101085801010867010108570901
+070e0001030002020401030102020400060001000849010108d501010890010108580101
+0867010108570901070e0001030002020401030102020400060001000849010108d50101
+08900101085801010867010108570901070e000103000202040103010202040006000100
+0849010108d5010108900101085801010867010108570901070e00010300020204010301
+02020400060001000849010108d5010108900101085801010867010108570901070e0001
+030002020401030102020400060001ff01ff01d40901070e000103000202040103010202
+0400060001ff01ff01d40901070e00010300020204010301020204000600010008490101
+08d5010108900101085801010867010108570901070e0001030002020401030102020400
+060001000849010108d5010108900101085801010867010108570901070e000103000202
+0401030102020400060001000805010008230100081d0101086e01000865010108900101
+085801010867010108570901070e00010300020204010301020204000600010008040100
+08040101080a0102080b010108020100081c0101084f0102081b010008020102085f0101
+0890010108030101085201010802010208030102085a0101080201020803010208030102
+08430901070e000103000202040103010202040006000100080301000804010008010100
+0808010008020100080901000801010008020100081b010108510100081a010008020100
+08020100085e010108900101080201000801010008510101080101000802010008010100
+080201000859010108010100080201000801010008020100080101000802010008420901
+070e00010300020204010301020204000600010008020100080501000801010008080100
+08020100080901000801010008030100081a010108020101080001000802010208020100
+08000101080a010208030102080201000800010108020100080201000802010208020100
+080001010804010108050100080301020803010208020100080001010805010008020100
+086201010801010008000101080301020802010008020100087b01010802010008010100
+085101010805010008050100085901010805010008010100080201000801010008460901
+070e00010300020204010301020204000600010008010100080601000801010008080100
+080201000809010008010100080401000819010108010100080101010801010008020100
+080101010801010008080100080201000801010008020100080101010801010008010100
+080201000801010008020100080101010801010008030101080501000802010008020100
+080101000802010008010101080101000803010008030100086201010801010108010100
+08010100080201000801010008020100087b010108020100080101000851010108050100
+08050100085901010805010008010100080201000801010008460901070e000103000202
+040103010202040006000100080001000807010008010100080901030809010008010100
+080501000818010108010100080201000801010008020100080101000802010008080100
+0805010008020100080101000805010008020100080101000802010008010100080f0100
+0802010008020100080101000802010008010100080201000803010008030103085f0101
+0801010008050100080201000802010008000100087c0101080201000801010008510101
+0804010008050100085a010108040100080301020802010308430901070e000103000202
+040103010202040006000100080101000806010008010100080c01000809010008010100
+080401000819010108010100080201000801010408010100080201000809010208020104
+0801010008060100080001000802010408010100080f0100080201000802010008010100
+080201000801010008020100080201000804010008020100085e01010801010008050104
+08030100087d01010802010008010100085101010803010008050100085b010108030100
+0803010008020100080101000802010008420901070e0001030002020401030102020400
+06000100080201000805010008010100080c0100080901000801010008030100081a0101
+0801010008020100080101000805010008020100080c0100080101000805010008060100
+080001000802010008050100080f01000802010008020100080101000802010008010100
+08020100080201000804010008020100085e010108010100080501000806010008000100
+087c01010802010008010100085101010802010008050100085c01010802010008040100
+08020100080101000802010008420901070e000103000202040103010202040006000100
+080301000804010008010100080301010802010008020100080301010803010008010100
+08020100081b010108010100080101010801010008020100080101000802010008080100
+080201000801010008020100080101000807010008030100080201000801010008070101
+080501000802010008020100080101000802010008010101080101000801010008050100
+08020100085e01010801010008050100080201000801010008020100087b010108020100
+08010100085101010801010008050100085d010108010100080501000802010008010100
+0802010008420901070e0001030002020401030102020400060001000804010008040101
+0804010108030102080401010804010108020100081c0101080201010800010008020102
+080201000802010008090102080301020802010008070100080401020802010008070101
+08050100080301020803010208020100080001010802010008060102085f010108010100
+080601020802010008020100087b01010803010108520101080101040801010408590101
+08010104080201020803010208430901070e000103000202040103010202040006000100
+0805010008230100081d010108050100080e010508470100087001010890010108580101
+0867010108570901070e0001030002020401030102020400060001000849010108010100
+08020100085c01000870010108900101085801010867010108570901070e000103000202
+0401030102020400060001000849010108020102085d0100087001010890010108580101
+0867010108570901070e0001030002020401030102020400060001000849010108d50101
+08900101085801010867010108570901070e000103000202040103010202040006000100
+0849010108d5010108900101085801010867010108570901070e00010300020204010301
+02020400060001000849010108d5010108900101085801010867010108570901070e0001
+030002020401030102020400060001000849010108d50101089001010858010108670101
+08570901070e0001030002020401030102020400060001ff01ff01d40901070e00010300
+02020401030102020400060001ff01ff01d40901070e0001030002020401030102020400
+060001000849010108d5010108900101085801010867010108570901070e000103000202
+0401030102020400060001000849010108d5010108900101085801010867010108570901
+070e00010300020204010301020204000600010008050100082a010008160101086e0100
+0865010108900101085801010867010108570901070e0001030002020401030102020400
+060001000804010008040101080b010008050101080b01010802010008150101084f0102
+081b010008020102085f01010809010208090100080d0102086701010803010108520101
+0802010208030102085a010108020102080201040801010408420901070e000103000202
+040103010202040006000100080301000804010008010100080901010804010008010100
+0809010008010100080201000814010108510100081a01000802010008020100085e0101
+080b010008090100080f0100086701010802010008010100085101010801010008020100
+080101000802010008590101080101000802010008010100080201000801010008460901
+070e00010300020204010301020204000600010008020100080501000801010008080100
+080001000804010008010100080901000801010008030100081301010802010108000100
+080201020802010008000101080a01020803010208020100080001010802010008020100
+080201020802010008000101080401010805010008030102080301020802010008000101
+080501000802010008620101080201010800010008040100080301020802010008000101
+0803010208050100080901000800010108030102080201010800010008030102080a0102
+080301020802010008000101080201000802010008020102080201000800010108130101
+080201000801010008510101080101000802010008010100080201000859010108050100
+080501000801010008460901070e00010300020204010301020204000600010008010100
+0806010008010100080a0100080401000801010008090100080101000804010008120101
+080101000801010108010100080201000801010108010100080801000802010008010100
+080201000801010108010100080101000802010008010100080201000801010108010100
+080301010805010008020100080201000801010008020100080101010801010008030100
+080301000862010108010100080101010804010008020100080201000801010108010100
+080101000802010008040100080901010801010008010100080201000801010008000100
+080001000801010008020100080801000802010008010100080201000801010108010100
+080101000802010008010100080201000801010108010100081201010802010008010100
+085101010801010008020100080101000802010008590101080501000804010008020103
+08430901070e000103000202040103010202040006000100080001000807010008010100
+080a01000804010008010100080901000801010008050100081101010801010008020100
+080101000802010008010100080201000808010008050100080201000801010008050100
+08020100080101000802010008010100080f010008020100080201000801010008020100
+08010100080201000803010008030103085f010108010100080201000804010008020100
+080201000801010008020100080501000804010008090100080201000805010008010100
+080001000800010008010100080201000808010008050100080201000801010008050100
+080201000801010008020100080101000816010108020100080101000851010108020102
+08030102085a010108030101080501000806010008420901070e00010300020204010301
+0202040006000100080101000806010008010100080a0100080401000801010008090100
+080101000804010008120101080101000802010008010104080101000802010008090102
+080201040801010008060100080001000802010408010100080f01000802010008020100
+08010100080201000801010008020100080201000804010008020100085e010108010100
+080201000804010008020100080201000801010008020100080201030804010008090100
+080201000802010308010100080001000800010008010104080901020802010408010100
+080601000800010008020104080101000816010108020100080101000851010108010100
+0802010008010100080201000859010108050100080401000806010008420901070e0001
+03000202040103010202040006000100080201000805010008010100080a010008040100
+080101000809010008010100080301000813010108010100080201000801010008050100
+08020100080c0100080101000805010008060100080001000802010008050100080f0100
+080201000802010008010100080201000801010008020100080201000804010008020100
+085e01010801010008020100080401000802010008020100080101000802010008010100
+080201000804010008090100080201000801010008020100080101000800010008000100
+080101000810010008010100080501000806010008000100080201000805010008160101
+080201000801010008510101080101000802010008010100080201000859010108050100
+08030100080301000802010008420901070e000103000202040103010202040006000100
+080301000804010008010100080301010804010008040100080101000803010108030100
+080101000802010008140101080101000801010108010100080201000801010008020100
+080801000802010008010100080201000801010008070100080301000802010008010100
+080701010805010008020100080201000801010008020100080101010801010008010100
+0805010008020100085e0101080101000801010108040100080201000802010008010101
+080101000801010008020100080401000809010008020100080101000802010008010100
+080001000800010008010100080201000808010008020100080101000802010008010100
+080701000803010008020100080101000816010108020100080101000851010108010100
+080201000801010008020100085901010801010008020100080301000803010008020100
+08420901070e000103000202040103010202040006000100080401000804010108040101
+080201040803010108040101080401010802010008150101080201010800010008020102
+080201000802010008090102080301020802010008070100080401020802010008070101
+08050100080301020803010208020100080001010802010008060102085f010108020101
+080001000804010008030102080201000800010108030103080401000809010008020100
+0802010308010100080001000800010008020102080a0102080301020802010008070100
+08040102080201000816010108030101085201010802010208030102085a010108020102
+080401000804010208430901070e00010300020204010301020204000600010008050100
+082a01000816010108050100080e010508470100087001010805010008230105081c0105
+083c0101085801010867010108570901070e000103000202040103010202040006000100
+084901010801010008020100085c01000870010108010100080201000889010108580101
+0867010108570901070e0001030002020401030102020400060001000849010108020102
+085d01000870010108020102088a0101085801010867010108570901070e000103000202
+0401030102020400060001000849010108d5010108900101085801010867010108570901
+070e0001030002020401030102020400060001000849010108d501010890010108580101
+0867010108570901070e0001030002020401030102020400060001000849010108d50101
+08900101085801010867010108570901070e000103000202040103010202040006000100
+0849010108d5010108900101085801010867010108570901070e00010300020204010301
+02020400060001ff01ff01d40901070e0001030002020401030102020400060001ff01ff
+01d40901070e0001030002020401030102020400060001000849010108d5010108900101
+085801010867010108570901070e00010300020204010301020204000600010008490101
+08d5010108900101085801010867010108570901070e0001030002020401030102020400
+0600010008050100082a010008160101086e010008650101089001010858010108670101
+08570901070e0001030002020401030102020400060001000804010008040101080b0100
+08050100080c01010802010008150101084f0102081b010008020102085f010108110100
+087d01010803010108520101080301000805010008040102085301010802010208030102
+0804010108430901070e0001030002020401030102020400060001000803010008040100
+080101000809010108040101080b010008010100080201000814010108510100081a0100
+0802010008020100085e010108110100087d010108020100080101000851010108020101
+080401010803010008020100085201010801010008020100080101000802010008020100
+0801010008420901070e0001030002020401030102020400060001000802010008050100
+0801010008080100080001000803010008000100080b0100080101000803010008130101
+0802010108000100080201020802010008000101080a0102080301020802010008000101
+080201000802010008020102080201000800010108040101080501000803010208030102
+080201000800010108050100080201000862010108010100080001010803010208020104
+080901020802010008020100080101000800010108600101080201000801010008510101
+080101000800010008030100080001000803010008560101080501000805010008020100
+0801010008420901070e0001030002020401030102020400060001000801010008060100
+08010100080a010008050100080b01000801010008040100081201010801010008010101
+080101000802010008010101080101000808010008020100080101000802010008010101
+080101000801010008020100080101000802010008010101080101000803010108050100
+080201000802010008010100080201000801010108010100080301000803010008620101
+0801010108010100080101000802010008030100080a0100080201000801010008020100
+0801010108010100085f0101080201000801010008510101080301000805010008030100
+085601010805010008050100080201000801010008420901070e00010300020204010301
+0202040006000100080001000807010008010100080a010008050100080b010008010100
+080501000811010108010100080201000801010008020100080101000802010008080100
+0805010008020100080101000805010008020100080101000802010008010100080f0100
+0802010008020100080101000802010008010100080201000803010008030103085f0101
+0801010008020100080101000802010008030100080a0100080501000802010008010100
+08020100085f010108020100080101000851010108030100080501000803010308530101
+0803010108050100080301000801010008420901070e0001030002020401030102020400
+06000100080101000806010008010100080a010008050100080b01000801010008040100
+081201010801010008020100080101040801010008020100080901020802010408010100
+08060100080001000802010408010100080f010008020100080201000801010008020100
+0801010008020100080201000804010008020100085e0101080101000802010008010104
+08030100080b010208020100080201000801010008020100085f01010802010008010100
+085101010803010008050100080301000802010008520101080501000803010008040100
+0801010008420901070e0001030002020401030102020400060001000802010008050100
+08010100080a010008050100080b01000801010008030100081301010801010008020100
+080101000805010008020100080c01000801010008050100080601000800010008020100
+08050100080f010008020100080201000801010008020100080101000802010008020100
+0804010008020100085e010108010100080201000801010008070100080e010008010100
+080201000801010008020100085f01010802010008010100085101010803010008050100
+0803010008020100085201010805010008020100080501000801010008420901070e0001
+030002020401030102020400060001000803010008040100080101000803010108040100
+080501000805010108030100080101000802010008140101080101000801010108010100
+080201000801010008020100080801000802010008010100080201000801010008070100
+080301000802010008010100080701010805010008020100080201000801010008020100
+0801010108010100080101000805010008020100085e0101080101000802010008010100
+0802010008030100080a01000802010008010100080101010801010108010100085f0101
+080201000801010008510101080301000805010008030100080201000852010108010100
+0802010008010100080601000801010008420901070e0001030002020401030102020400
+060001000804010008040101080401010802010408010104080301010804010108020100
+081501010802010108000100080201020802010008020100080901020803010208020100
+080701000804010208020100080701010805010008030102080301020802010008000101
+0802010008060102085f0101080101000802010008020102080501010809010208030101
+080001000801010008000101086001010803010108520101080101040801010408020102
+0853010108020102080201040803010108430901070e0001030002020401030102020400
+0600010008050100082a01000816010108050100080e0105084701000870010108150105
+080f010008630101085801010867010108570901070e0001030002020401030102020400
+06000100084901010801010008020100085c010008700101082b01000863010108580101
+0867010108570901070e0001030002020401030102020400060001000849010108020102
+085d010008700101082b010008630101085801010867010108570901070e000103000202
+0401030102020400060001000849010108d5010108900101085801010867010108570901
+070e0001030002020401030102020400060001000849010108d501010890010108580101
+0867010108570901070e0001030002020401030102020400060001000849010108d50101
+08900101085801010867010108570901070e000103000202040103010202040006000100
+0849010108d5010108900101085801010867010108570901070e00010300020204010301
+02020400060001ff01ff01d40901070e0001030002020401030102020400060001ff01ff
+01d40901070e0001030002020401030102020400060001000849010108d5010108900101
+085801010867010108570901070e00010300020204010301020204000600010008490101
+08d5010108900101085801010867010108570901070e0001030002020401030102020400
+0600010008050100082a010008160101086e010008650101089001010858010108670101
+08570901070e0001030002020401030102020400060001000804010008040101080b0100
+08040102080b01010802010008150101084f0102081b010008020102085f010108110100
+080301000878010108030101085201010802010208030102085a01010802010208030102
+0804010008440901070e0001030002020401030102020400060001000803010008040100
+080101000809010108030100080201000809010008010100080201000814010108510100
+081a01000802010008020100085e01010811010008030100087801010802010008010100
+085101010801010008020100080101000802010008590101080101000802010008010100
+080201000802010108440901070e00010300020204010301020204000600010008020100
+080501000801010008080100080001000807010008090100080101000803010008130101
+0802010108000100080201020802010008000101080a0102080301020802010008000101
+080201000802010008020102080201000800010108040101080501000803010208030102
+080201000800010108050100080201000862010108020102080201000802010008010104
+080101000800010108750101080201000801010008510101080501000805010008590101
+0805010008050100080101000800010008440901070e0001030002020401030102020400
+06000100080101000806010008010100080a010008070100080901000801010008040100
+081201010801010008010101080101000802010008010101080101000808010008020100
+080101000802010008010101080101000801010008020100080101000802010008010101
+080101000803010108050100080201000802010008010100080201000801010108010100
+080301000803010008620101080101000802010008010100080201000803010008030101
+080101000874010108020100080101000851010108050100080501000859010108050100
+080501000803010008440901070e00010300020204010301020204000600010008000100
+0807010008010100080a010008060100080a010008010100080501000811010108010100
+080201000801010008020100080101000802010008080100080501000802010008010100
+0805010008020100080101000802010008010100080f0100080201000802010008010100
+0802010008010100080201000803010008030103085f0101080501000801010008020100
+080301000803010008020100087401010802010008010100085101010804010008050100
+085a010108040100080401010804010008440901070e0001030002020401030102020400
+06000100080101000806010008010100080a010008050100080b01000801010008040100
+081201010801010008020100080101040801010008020100080901020802010408010100
+08060100080001000802010408010100080f010008020100080201000801010008020100
+0801010008020100080201000804010008020100085e0101080201030801010008020100
+080301000803010008020100087401010802010008010100085101010803010008050100
+085b010108030100080701000803010008440901070e0001030002020401030102020400
+06000100080201000805010008010100080a010008040100080c01000801010008030100
+081301010801010008020100080101000805010008020100080c01000801010008050100
+08060100080001000802010008050100080f010008020100080201000801010008020100
+0801010008020100080201000804010008020100085e0101080101000802010008010100
+080201000803010008030100080201000874010108020100080101000851010108020100
+08050100085c010108020100080801000803010008440901070e00010300020204010301
+020204000600010008030100080401000801010008030101080401000803010008070101
+080301000801010008020100081401010801010008010101080101000802010008010100
+080201000808010008020100080101000802010008010100080701000803010008020100
+080101000807010108050100080201000802010008010100080201000801010108010100
+080101000805010008020100085e01010801010008020100080101000801010108030100
+0803010008020100087401010802010008010100085101010801010008050100085d0101
+0801010008050100080201000803010008440901070e0001030002020401030102020400
+060001000804010008040101080401010802010408010104080301010804010108020100
+081501010802010108000100080201020802010008020100080901020803010208020100
+080701000804010208020100080701010805010008030102080301020802010008000101
+0802010008060102085f0101080201030802010108000100080401010801010008020100
+087401010803010108520101080101040801010408590101080101040802010208020104
+08420901070e00010300020204010301020204000600010008050100082a010008160101
+08050100080e0105084701000870010108900101085801010867010108570901070e0001
+03000202040103010202040006000100084901010801010008020100085c010008700101
+08900101085801010867010108570901070e000103000202040103010202040006000100
+0849010108020102085d01000870010108900101085801010867010108570901070e0001
+030002020401030102020400060001000849010108d50101089001010858010108670101
+08570901070e0001030002020401030102020400060001000849010108d5010108900101
+085801010867010108570901070e00010300020204010301020204000600010008490101
+08d5010108900101085801010867010108570901070e0001030002020401030102020400
+060001000849010108d5010108900101085801010867010108570901070e000103000202
+0401030102020400060001ff01ff01d40901070e00010300020204010301020204000600
+01ff01ff01d40901070e0001030002020401030102020400060001000849010108d50101
+08900101085801010867010108570901070e000103000202040103010202040006000100
+0849010108d5010108900101085801010867010108570901070e00010300020204010301
+020204000600010008050100082a010008160101086e0100086501010890010108580101
+0867010108570901070e0001030002020401030102020400060001000804010008040101
+080b010008040102080b01010802010008150101084f0102081b010008020102085f0101
+08110100080a010008220102084b01010803010108520101080101040805010008050100
+0852010108020102080201040801010408420901070e0001030002020401030102020400
+060001000803010008040100080101000809010108030100080201000809010008010100
+080201000814010108510100081a01000802010008020100085e010108110100080a0100
+08240100084b010108020100080101000851010108010100080801010804010108520101
+080101000802010008010100080201000801010008460901070e00010300020204010301
+020204000600010008020100080501000801010008080100080001000807010008090100
+0801010008030100081301010802010108000100080201020802010008000101080a0102
+080301020802010008000101080201000802010008020102080201000800010108040101
+080501000803010208030102080201000800010108050100080201000862010108010100
+080001010803010208020104080801000801010008030102080201000800010108020100
+080001010803010208050100084b01010802010008010100085101010801010008070100
+0800010008030100080001000852010108050100080501000801010008460901070e0001
+03000202040103010202040006000100080101000806010008010100080a010008070100
+080901000801010008040100081201010801010008010101080101000802010008010101
+080101000808010008020100080101000802010008010101080101000801010008020100
+080101000802010008010101080101000803010108050100080201000802010008010100
+080201000801010108010100080301000803010008620101080101010801010008010100
+0802010008030100080a0100080001000803010008020100080101010801010008010101
+08010100080101000802010008040100084b010108020100080101000851010108010103
+080301000801010008020100080101000852010108050100080401000802010308430901
+070e000103000202040103010202040006000100080001000807010008010100080a0100
+08050101080a010008010100080501000811010108010100080201000801010008020100
+080101000802010008080100080501000802010008010100080501000802010008010100
+0802010008010100080f0100080201000802010008010100080201000801010008020100
+0803010008030103085f01010801010008020100080101000802010008030100080a0101
+0804010008020100080101000805010008020100080101000802010008040100084b0101
+080201000801010008510101080501000801010008020100080101000802010008520101
+08030101080501000806010008420901070e000103000202040103010202040006000100
+080101000806010008010100080a01000807010008090100080101000804010008120101
+080101000802010008010104080101000802010008090102080201040801010008060100
+080001000802010408010100080f01000802010008020100080101000802010008010100
+08020100080201000804010008020100085e010108010100080201000801010408030100
+080a0101080401040801010008050100080201000801010408040100084b010108020100
+080101000851010108050100080101000802010008010100080201000852010108050100
+080401000806010008420901070e00010300020204010301020204000600010008020100
+0805010008010100080a0100080701000809010008010100080301000813010108010100
+08020100080101000805010008020100080c010008010100080501000806010008000100
+0802010008050100080f0100080201000802010008010100080201000801010008020100
+080201000804010008020100085e010108010100080201000801010008070100080a0100
+08000100080301000805010008050100080201000801010008080100084b010108020100
+080101000851010108010100080201000801010508000105085101010805010008030100
+080301000802010008420901070e00010300020204010301020204000600010008030100
+080401000801010008030101080401000803010008020100080301010803010008010100
+080201000814010108010100080101010801010008020100080101000802010008080100
+080201000801010008020100080101000807010008030100080201000801010008070101
+080501000802010008020100080101000802010008010101080101000801010008050100
+08020100085e01010801010008020100080101000802010008030100080a010008010100
+0802010008020100080101000805010008020100080101000802010008040100084b0101
+080201000801010008510101080101000802010008050100080501000852010108010100
+0802010008030100080301000802010008420901070e0001030002020401030102020400
+060001000804010008040101080401010802010408020102080401010804010108020100
+081501010802010108000100080201020802010008020100080901020803010208020100
+080701000804010208020100080701010805010008030102080301020802010008000101
+0802010008060102085f0101080101000802010008020102080501010808010008020100
+080201020802010008050100080201000802010208050100084b01010803010108520101
+0802010208060100080501000852010108020102080401000804010208430901070e0001
+0300020204010301020204000600010008050100082a01000816010108050100080e0105
+08470100087001010815010508740101085801010867010108570901070e000103000202
+040103010202040006000100084901010801010008020100085c01000870010108900101
+085801010867010108570901070e00010300020204010301020204000600010008490101
+08020102085d01000870010108900101085801010867010108570901070e000103000202
+0401030102020400060001000849010108d5010108900101085801010867010108570901
+070e0001030002020401030102020400060001000849010108d501010890010108580101
+0867010108570901070e0001030002020401030102020400060001000849010108d50101
+08900101085801010867010108570901070e000103000202040103010202040006000100
+0849010108d5010108900101085801010867010108570901070e00010300020204010301
+02020400060001ff01ff01d40901070e0001030002020401030102020400060001ff01ff
+01d40901070e0001030002020401030102020400060001000849010108d5010108900101
+0858010108670101085709010010030002020401030102020400060001000849010108d5
+0101089001010858010108670101085709010700000c0900000103000202040103010202
+04000600010008050100082a010008160101088301000850010108900101085801010867
+010108570901070000010608090107000001030002020401030102020400060001000804
+010008040101080b010008070100080a0101080201000815010108110100080a01000822
+0102080b01000806010008090100081501000807010008020102084a0101089001010803
+0101085201010805010008020102085a0101080201020802010408490901070100010607
+090107000001030002020401030102020400060001000803010008040100080101000809
+0101080601010809010008010100080201000814010108110100080a010008240100080b
+010008110100081401010806010008020100080201000849010108900101080201000801
+010008510101080401010801010008020100085901010801010008020100080101000802
+010008490901070100010606090107010001030002020401030102020400060001000802
+010008050100080101000808010008000100080501000800010008090100080101000803
+010008130101080101000800010108030102080201040808010008010100080301020802
+010008000101080201000800010108030102080501000804010108020104080201020803
+010208020100080101000803010208020100080001010802010008000100080601000806
+010008490101089001010802010008010100085101010803010008000100080101000802
+010008590101080101000802010008050100084909010702000106050901070100010300
+0202040103010202040006000100080101000806010008010100080a0100080401000801
+010008090100080101000804010008120101080101010801010008010100080201000803
+0100080a0100080001000803010008020100080101010801010008010101080101000801
+010008020100080401000804010108040100080601000802010008020100080101000800
+010008030100080201000801010108010100080301000805010008070100084901010890
+010108020100080101000851010108020100080101000801010008020100085901010801
+01000802010008040100084a090107020001060409010702000103000202040103010202
+040006000100080001000807010008010100080a01000803010008020100080901000801
+010008050100081101010801010008020100080101000802010008030100080a01010804
+010008020100080101000805010008020100080101000802010008040100080b01000806
+01000802010008050101080401000802010008010100080701000805010008060100084a
+010108900101080201000801010008510101080101000802010008020102085a01010802
+010208050100084a09010703000106030901070200010300020204010301020204000600
+0100080101000806010008010100080a0100080301000802010008090100080101000804
+01000812010108010100080201000801010408030100080a010108040104080101000805
+0100080201000801010408040100080b0100080601000802010008050101080401040801
+0100080701000804010008060100084b0101089001010802010008010100085101010801
+010008020100080101000802010008590101080101000802010008040100084a09010703
+000106020901070300010300020204010301020204000600010008020100080501000801
+0100080a0100080301050808010008010100080301000813010108010100080201000801
+010008070100080a01000800010008030100080501000805010008020100080101000808
+0100080b0100080601000802010008050100080001000803010008050100080701000804
+010008050100084c01010890010108020100080101000851010108010105080001000802
+010008590101080101000802010008030100084b09010704000106010901070300010300
+020204010301020204000600010008030100080401000801010008030101080401000807
+010008030101080301000801010008020100081401010801010008020100080101000802
+010008030100080a01000801010008020100080201000801010008050100080201000801
+010008020100080401000804010108040100080601000802010008020100080101000801
+0100080201000802010008010100080701000803010008050100084d0101089001010802
+010008010100085101010805010008010100080201000859010108010100080201000803
+0100084b0901070400010600090107040001030002020401030102020400060001000804
+010008040101080401010802010408050100080301010804010108020100081501010801
+010008020100080201020805010108080100080201000802010208020100080501000802
+010008020102080501000804010108050101080401000803010208020100080201000802
+010208020100080501040801010008050104084901010890010108030101085201010805
+010008020102085a01010802010208040100084b09010705000009020704000103000202
+04010301020204000600010008050100082a0100081601010815010508b9010108900101
+085801010867010108570901070500000901070500010300020204010301020204000600
+01000849010108d501010890010108580101086701010857090107060901070500010300
+02020401030102020400060001000849010108d501010890010108580101086701010857
+09010706090007060001030002020401030102020400060001000849010108d501010890
+010108580101086701010857090100100300020204010301020204000600010008490101
+08d5010108900101085801010867010108570900001103000202040103010202040009ff
+09ff09d9060e03000202040103010202040009ff09ff09d80000060e0300020204010301
+020204000901070d0000070000ff00ff00a507100001070c0001060e0300020204010301
+020204000901070b00010900070000ff00ff00a4090007100003070a0001060e03000202
+040103010202040009010709000209010700000106ff06ff06a109010710000507080001
+060e030002020401030102020400090107070003060009010700000106ff06ff06a10901
+071000010601000307060001060e03000202040103010202040009010705000306020901
+0700000106ff06ff06a10901071000010603000307040001060e03000202040103010202
+0400090107030003060409010700000106ff06ff06a10901071000010605000307020001
+060e030002020401030102020400090107010003060609010700000106ff06ff06a10901
+071000010607000307000001060e03000202040103010202040009050608090107000001
+06ff06ff06a1090107100001060809030001060e03000202040103010202040009010701
+0903060609010700000106ff06ff06a10901071000010607090307000001060e03000202
+0401030102020400090107030903060409010700000106ff06ff06a10901071000010605
+090307020001060e030002020401030102020400090107050903060209010700000106ff
+06ff06a10901071000010603090307040001060e03000202040103010202040009010707
+0903060009010700000106ff06ff06a10901071000010601090307060001060e03000202
+04010301020204000901070909040700000106ff06ff06a1090107100001090307080001
+060e0300020204010301020204000901070b09020700000109ff09ff09a3071000010901
+070a0001060e0300020204010301020204000901070d09000700000009ff09ff09a40710
+00000900070c0001060e030002020401030102020400090100ff00ff00d7060e03000202
+0401030102020400090000ff00ff00d8060e03000202040103010202040006ff06ff06e8
+03000202040103010202040006ff06ff06e803000202040103010202040006ff06ff06e8
+03000202040103010202040006ff06ff06e803000202040103010202040006ff06ff06e8
+03000202040103010202040006ff06ff06e803000202040103010202040006ff06ff06e8
+03000202040103010202040006ff06ff06e803000202040103010202040006ff06ff06e8
+03000202040103010202040006ff06ff06e803000202040103010202040006ff06ff06e8
+03000202040103010202040006ff06ff06e803000202040103010202040006ff06ff06e8
+03000202040103010202040006ff06ff06e803000202040103010202040006ff06ff0615
+01000601010006ce030002020401030004040601000a0607010006020100060401000606
+010006100102061201000686000a06090100060c01000611010006020100060401000606
+0100060f01000602010006e0010006010100060801000602010006040100060601000605
+0100061f010106890300040403050601000909000607010006020100060c0100060f0100
+060201000611010006860009090006090100060c01000611010006020100060c0100060f
+01010601010006e00100060101000608010006020100060c010006050100061e01000601
+010006880304040003010202040006010001060609010607010006020100060201020603
+010106000100060201020609010006050100060201000602010206020104060201020602
+010106000100060901000600010106020100060001010603010206030102060301020603
+010206030102060301020603010206310001060609010608010006000100060201000602
+010006010104060201020609010006020100060201020603010106000100060201020609
+01010601010006020102060201000602010006d101050607010006020100060201020603
+010106000100060201010600010006020102060201000600010106040101060a01000601
+010006880300020204010301020204000601000106060901060701000602010006040100
+060201000601010106010100060201000609010006040100060201000601010006020100
+060301000603010006020100060101000600010006000100060801010601010006010101
+060101000601010006020100060101000602010006010100060201000601010006020100
+060101000602010006010100060201000601010006020100063000010606090106080100
+060001000602010006020100060301000603010006020100060801000602010006040100
+060201000601010106010100060201000608010006000100060001000601010006020100
+060101000602010006d20100060101000608010006020100060401000602010006010101
+06010100060101010601010006020100060101010601010006030101060a010006010100
+068803000202040103010202040006010001060609010607010406040100060201000602
+01000601010006020100060a010106030100060101000601010006070100060301000602
+010006010100060001000600010006080100060201000601010006050100060201000601
+010006050100060201000601010006050100060501000602010006010100063400010606
+090106080100060001000602010006020100060301000603010006020100060101040601
+010406040100060201000602010006010100060201000608010006000100060001000601
+01000602010006010100060001000600010006d101000601010006090104060401000602
+010006020100060101000602010006010100060201000601010006020100061001000601
+010006880300020204010301020204000601000106060901060701000602010006040100
+060201000602010006010104060c01000602010006010100060201020604010006030104
+060101000600010006000100060801000602010006010100060501000602010006010100
+060501040602010206030102060201040602010206310001060609010607010006020100
+060101000602010006030100060301000602010006080100060201000604010006020100
+060201000601010406080100060101010601010406010100060001000600010006d00105
+060801000602010006040100060201000602010006010100060201000601010406010100
+060201000610010006010100068803000202040103010202040006010001060609010607
+01000602010006040100060201000602010006010100060c010006020100060301000600
+010006050100060301000603010006050100060001000600010006080100060201000601
+010006050100060201000601010006050100060901000605010006010100060901000630
+000106060901060701040601010006020100060301000603010006020100060801000602
+010006040100060201000602010006010100060c01000601010106010100060501000600
+01000600010006d101000601010006090100060201000604010006020100060201000601
+010006020100060101000605010006020100061001000601010006880300020204010301
+020204000601000106060901060701000602010006040100060201000601010106010100
+060201000608010006020100060301010602010006020100060301000603010006020100
+060101000600010006000100060801010601010006010100060501000602010006010100
+060201000601010006020100060101000602010006010100060201000601010006020100
+060101000602010006300001060609010607010006020100060101000601010106030100
+060301000602010006080100060201000604010006020100060101010601010006020100
+0608010006020100060101000602010006010100060001000600010006d1010006010100
+060901000602010006040100060201000601010106010100060101010601010006020100
+060101000602010006030101060a01000601010006880300020204010301020204000601
+000106060901060701000602010006040100060301010600010006020102060a01020605
+010006030102060501010602010206020100060001000600010006080100060001010602
+010006060102060301020603010206030102060301020603010206030102063100010606
+090106070100060201000602010106000100060401010602010206090100060201000604
+0100060301010600010006020102060901000602010006020102060301000600010006d2
+010006010100060901000602010006040100060301010600010006020101060001000602
+0102060201000602010006030101060b0101068903000202040103010202040006010001
+09080634010006250100066c0001090806ff06ff06060300020204010301020204000601
+00000909063101000600010006260100066c0000090906ff06ff06060300020204010301
+02020400063f01000627010006ff06ff067e03000202040103010202040006ff06ff06e8
+03000202040103010202040006ff06ff06e803000202040103010202040006ff06ff06e8
+03000202040103010202040006ff06ff06e803000202040103010202040006ff06ff06e8
+03000202040103010202040006ff06ff06e803000202040103010202040006ff06ff06e8
+03000202040103010202040006ff06ff06e803000202040103010202040006ff06ff06e8
+03000202040103010202040006ff06ff06e803000202040103010202040006ff06ff06e8
+03000202040103010202040006ff06ff06e803000202040103010202040006ff06ff06e8
+03000202040103010202040003ff03ff03e9020204010301021a0400030002ff02ff02b6
+04000300021a04010301021a0400030002ff02ff02b604000300021a04010301021a0400
+030002ff02ff02b604000300021a04010301041b030004ff04ff04b70300041c030004ff
+04ff04f3
+%%EndData
+end
+%%PageTrailer
+%%Trailer
+%%BoundingBox: 0 22 377 234
+%%EOF
diff --git a/lib/pman/doc/src/make.dep b/lib/pman/doc/src/make.dep
new file mode 100644
index 0000000000..2f6a8a06cd
--- /dev/null
+++ b/lib/pman/doc/src/make.dep
@@ -0,0 +1,26 @@
+# ----------------------------------------------------
+# >>>> Do not edit this file <<<<
+# This file was automaticly generated by
+# /home/otp/bin/docdepend
+# ----------------------------------------------------
+
+
+# ----------------------------------------------------
+# TeX files that the DVI file depend on
+# ----------------------------------------------------
+
+book.dvi: book.tex part.tex pman.tex pman_chapter.tex \
+ ref_man.tex
+
+# ----------------------------------------------------
+# Source inlined when transforming from source to LaTeX
+# ----------------------------------------------------
+
+book.tex: ref_man.xml
+
+# ----------------------------------------------------
+# Pictures that the DVI file depend on
+# ----------------------------------------------------
+
+book.dvi: main_window.ps options.ps trace.ps
+
diff --git a/lib/pman/doc/src/note.gif b/lib/pman/doc/src/note.gif
new file mode 100644
index 0000000000..6fffe30419
--- /dev/null
+++ b/lib/pman/doc/src/note.gif
Binary files differ
diff --git a/lib/pman/doc/src/notes.xml b/lib/pman/doc/src/notes.xml
new file mode 100644
index 0000000000..27e3b5e5fe
--- /dev/null
+++ b/lib/pman/doc/src/notes.xml
@@ -0,0 +1,144 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE chapter SYSTEM "chapter.dtd">
+
+<chapter>
+ <header>
+ <copyright>
+ <year>2004</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ The contents of this file are subject to the Erlang Public License,
+ Version 1.1, (the "License"); you may not use this file except in
+ compliance with the License. You should have received a copy of the
+ Erlang Public License along with this software. If not, it can be
+ retrieved online at http://www.erlang.org/.
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and limitations
+ under the License.
+
+ </legalnotice>
+
+ <title>Pman Release Notes</title>
+ <prepared>otp_appnotes</prepared>
+ <docno>nil</docno>
+ <date>nil</date>
+ <rev>nil</rev>
+ <file>notes.xml</file>
+ </header>
+ <p>This document describes the changes made to the Pman application.</p>
+
+<section><title>Pman 2.7.1</title>
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ The documentation is now built with open source tools
+ (xsltproc and fop) that exists on most platforms. One
+ visible change is that the frames are removed.</p>
+ <p>
+ Own Id: OTP-8201</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
+<section><title>Pman 2.7</title>
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>The copyright notices have been updated.</p>
+ <p>
+ Own Id: OTP-7851</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
+ <section>
+ <title>Pman 2.6</title>
+
+ <section>
+ <title>Improvements and New Features</title>
+ <list type="bulleted">
+ <item>
+ <p>Some maintenance work to replace deprecated guard
+ expressions etc. somehow grew into a larger rewrite of
+ parts of the Pman code, fixing some of the more blatant
+ errors and removing unused code.</p>
+ <p>The default font has been changed, so now the entire text
+ on buttons etc. should be visible on most platforms.</p>
+ <p>Saving and restoring trace options to/from file now
+ works.</p>
+ <p>Selecting different sets of processes to hide/view should
+ now work in a more consistent and logical way.</p>
+ <p>It is now possible to select more than one module or
+ process to hide/show.</p>
+ <p>Own Id: OTP-6012 Aux Id: OTP-5987 </p>
+ </item>
+ </list>
+ </section>
+ </section>
+
+ <section>
+ <title>Pman 2.5.3</title>
+
+ <section>
+ <title>Fixed Bugs and Malfunctions</title>
+ <list type="bulleted">
+ <item>
+ <p>Removed some dead code from <c>pman_process</c>.</p>
+ <p>Own Id: OTP-6550</p>
+ </item>
+ </list>
+ </section>
+ </section>
+
+ <section>
+ <title>Pman 2.5.2</title>
+
+ <section>
+ <title>Fixed Bugs and Malfunctions</title>
+ <list type="bulleted">
+ <item>
+ <p>Some dead code reported by Dialyzer was eliminated.</p>
+ <p>A bug in <c>dbg</c> when tracing to wrap trace files
+ has been corrected. It failed to delete any already existing
+ wrap trace files with the same names when starting a new
+ wrap trace.</p>
+ <p>Own Id: OTP-5329</p>
+ </item>
+ <item>
+ <p>The graphic applications now search for HTML
+ documentation in the correct place.</p>
+ <p>Own Id: OTP-5381</p>
+ </item>
+ </list>
+ </section>
+ </section>
+
+ <section>
+ <title>Pman 2.5.1</title>
+
+ <section>
+ <title>Fixed Bugs and Malfunctions</title>
+ <list type="bulleted">
+ <item>
+ <p>The Pman 'trace shell' functionality was broken, it has
+ now been fixed. Furthermore, Pman could not correctly
+ find the pid of the active shell if more than one shell
+ process was running on the node. This has also been
+ corrected.</p>
+ <p>Own Id: OTP-5191</p>
+ </item>
+ </list>
+ </section>
+ </section>
+</chapter>
+
diff --git a/lib/pman/doc/src/options.gif b/lib/pman/doc/src/options.gif
new file mode 100644
index 0000000000..18377fbed1
--- /dev/null
+++ b/lib/pman/doc/src/options.gif
Binary files differ
diff --git a/lib/pman/doc/src/options.ps b/lib/pman/doc/src/options.ps
new file mode 100644
index 0000000000..b5e2c6a391
--- /dev/null
+++ b/lib/pman/doc/src/options.ps
@@ -0,0 +1,829 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: (ImageMagick)
+%%Title: (./options.tmp.eps)
+%%CreationDate: (Tue Jun 12 18:04:30 2001)
+%%BoundingBox: 0 53 250 318
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 1
+%%Pages: 0
+%%EndComments
+
+%%BeginDefaults
+%%PageOrientation: Portrait
+%%EndDefaults
+
+%%BeginProlog
+%
+% Display a color image. The image is displayed in color on
+% Postscript viewers or printers that support color, otherwise
+% it is displayed as grayscale.
+%
+/buffer 512 string def
+/byte 1 string def
+/color_packet 3 string def
+/pixels 768 string def
+
+/DirectClassPacket
+{
+ %
+ % Get a DirectClass packet.
+ %
+ % Parameters:
+ % red.
+ % green.
+ % blue.
+ % length: number of pixels minus one of this color (optional).
+ %
+ currentfile color_packet readhexstring pop pop
+ compression 0 gt
+ {
+ /number_pixels 3 def
+ }
+ {
+ currentfile byte readhexstring pop 0 get
+ /number_pixels exch 1 add 3 mul def
+ } ifelse
+ 0 3 number_pixels 1 sub
+ {
+ pixels exch color_packet putinterval
+ } for
+ pixels 0 number_pixels getinterval
+} bind def
+
+/DirectClassImage
+{
+ %
+ % Display a DirectClass image.
+ %
+ systemdict /colorimage known
+ {
+ columns rows 8
+ [
+ columns 0 0
+ rows neg 0 rows
+ ]
+ { DirectClassPacket } false 3 colorimage
+ }
+ {
+ %
+ % No colorimage operator; convert to grayscale.
+ %
+ columns rows 8
+ [
+ columns 0 0
+ rows neg 0 rows
+ ]
+ { GrayDirectClassPacket } image
+ } ifelse
+} bind def
+
+/GrayDirectClassPacket
+{
+ %
+ % Get a DirectClass packet; convert to grayscale.
+ %
+ % Parameters:
+ % red
+ % green
+ % blue
+ % length: number of pixels minus one of this color (optional).
+ %
+ currentfile color_packet readhexstring pop pop
+ color_packet 0 get 0.299 mul
+ color_packet 1 get 0.587 mul add
+ color_packet 2 get 0.114 mul add
+ cvi
+ /gray_packet exch def
+ compression 0 gt
+ {
+ /number_pixels 1 def
+ }
+ {
+ currentfile byte readhexstring pop 0 get
+ /number_pixels exch 1 add def
+ } ifelse
+ 0 1 number_pixels 1 sub
+ {
+ pixels exch gray_packet put
+ } for
+ pixels 0 number_pixels getinterval
+} bind def
+
+/GrayPseudoClassPacket
+{
+ %
+ % Get a PseudoClass packet; convert to grayscale.
+ %
+ % Parameters:
+ % index: index into the colormap.
+ % length: number of pixels minus one of this color (optional).
+ %
+ currentfile byte readhexstring pop 0 get
+ /offset exch 3 mul def
+ /color_packet colormap offset 3 getinterval def
+ color_packet 0 get 0.299 mul
+ color_packet 1 get 0.587 mul add
+ color_packet 2 get 0.114 mul add
+ cvi
+ /gray_packet exch def
+ compression 0 gt
+ {
+ /number_pixels 1 def
+ }
+ {
+ currentfile byte readhexstring pop 0 get
+ /number_pixels exch 1 add def
+ } ifelse
+ 0 1 number_pixels 1 sub
+ {
+ pixels exch gray_packet put
+ } for
+ pixels 0 number_pixels getinterval
+} bind def
+
+/PseudoClassPacket
+{
+ %
+ % Get a PseudoClass packet.
+ %
+ % Parameters:
+ % index: index into the colormap.
+ % length: number of pixels minus one of this color (optional).
+ %
+ currentfile byte readhexstring pop 0 get
+ /offset exch 3 mul def
+ /color_packet colormap offset 3 getinterval def
+ compression 0 gt
+ {
+ /number_pixels 3 def
+ }
+ {
+ currentfile byte readhexstring pop 0 get
+ /number_pixels exch 1 add 3 mul def
+ } ifelse
+ 0 3 number_pixels 1 sub
+ {
+ pixels exch color_packet putinterval
+ } for
+ pixels 0 number_pixels getinterval
+} bind def
+
+/PseudoClassImage
+{
+ %
+ % Display a PseudoClass image.
+ %
+ % Parameters:
+ % class: 0-PseudoClass or 1-Grayscale.
+ %
+ currentfile buffer readline pop
+ token pop /class exch def pop
+ class 0 gt
+ {
+ currentfile buffer readline pop
+ token pop /depth exch def pop
+ /grays columns 8 add depth sub depth mul 8 idiv string def
+ columns rows depth
+ [
+ columns 0 0
+ rows neg 0 rows
+ ]
+ { currentfile grays readhexstring pop } image
+ }
+ {
+ %
+ % Parameters:
+ % colors: number of colors in the colormap.
+ % colormap: red, green, blue color packets.
+ %
+ currentfile buffer readline pop
+ token pop /colors exch def pop
+ /colors colors 3 mul def
+ /colormap colors string def
+ currentfile colormap readhexstring pop pop
+ systemdict /colorimage known
+ {
+ columns rows 8
+ [
+ columns 0 0
+ rows neg 0 rows
+ ]
+ { PseudoClassPacket } false 3 colorimage
+ }
+ {
+ %
+ % No colorimage operator; convert to grayscale.
+ %
+ columns rows 8
+ [
+ columns 0 0
+ rows neg 0 rows
+ ]
+ { GrayPseudoClassPacket } image
+ } ifelse
+ } ifelse
+} bind def
+
+/DisplayImage
+{
+ %
+ % Display a DirectClass or PseudoClass image.
+ %
+ % Parameters:
+ % x & y translation.
+ % x & y scale.
+ % label pointsize.
+ % image label.
+ % image columns & rows.
+ % class: 0-DirectClass or 1-PseudoClass.
+ % compression: 0-RunlengthEncodedCompression or 1-NoCompression.
+ % hex color packets.
+ %
+ gsave
+ currentfile buffer readline pop
+ token pop /x exch def
+ token pop /y exch def pop
+ x y translate
+ currentfile buffer readline pop
+ token pop /x exch def
+ token pop /y exch def pop
+ currentfile buffer readline pop
+ token pop /pointsize exch def pop
+ /Helvetica findfont pointsize scalefont setfont
+ x y scale
+ currentfile buffer readline pop
+ token pop /columns exch def
+ token pop /rows exch def pop
+ currentfile buffer readline pop
+ token pop /class exch def pop
+ currentfile buffer readline pop
+ token pop /compression exch def pop
+ class 0 gt { PseudoClassImage } { DirectClassImage } ifelse
+ grestore
+} bind def
+%%EndProlog
+%%Page: 1 1
+%%PageBoundingBox: 0 53 250 318
+userdict begin
+%%BeginData:
+DisplayImage
+0 53
+250.000000 265.000000
+12
+350 371
+1
+0
+0
+8
+ffffff
+000000
+708090
+b03060
+d9d9d9
+808080
+a3a3a3
+000000
+03ff03ff03ff035f04000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400031b040c0392040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+04000300040003000400030004000307040c03050400030a040003080404030b0402030d
+0401030104010305040703200403030a040103010401031e040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000308040003020400030204000302
+040003050400030a0400030804010301040103090401030f040103010401030804010322
+040103010401030904010321040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003070400030204000302040003020400030504000303
+040203030400030804010302040103010403030104030301040303010401030104010300
+040103000403030704010302040103000401030004030302040303020403030604010303
+04010300040103000401030104030300040103010403030104010300040103020403030a
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000308
+040003020400030204000302040003050400030204040302040003080401030204010300
+040103010401030104010301040103010401030004010301040103000401030104010308
+040103020406030104010300040103010401030004010301040103050401030304010300
+040203000401030104010301040103000401030104010300040203000401030004010301
+040103080400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030704040302040003020400030504000301040603010400030804010302
+040103000401030104010301040103050401030004010301040103000401030104010308
+040103020402030504010300040103040401030104010305040103030401030004010301
+040103010401030104010300040103010401030004010301040103000402030c04000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030804000306
+040003020400030504000301040603010400030804010302040103000405030104010302
+040403000401030104010300040103010401030804010302040103030404030004010304
+040503050401030304010300040103010401030104010301040103000401030104010300
+040103010401030204020309040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003070400030604000302040003050400030104060301
+040003080401030204010300040103050401030104010301040103000401030104010300
+040103010401030804010302040103020401030104010300040103040401030904010303
+040103000401030104010301040103010401030004010301040103000401030104010303
+040203090400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003080400030604000302040003050400030204040302040003080401030104010301
+040103010401030104010301040103010401030004010300040203000401030104010300
+040003060401030204010302040103010401030004010301040103000401030104010306
+040103010401030104020300040103010401030004020300040103010401030004010301
+040103000401030104010308040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003070408030204000305040003030402030304000308
+040403030403030204010302040203000401030004010300040103000401030204010307
+040103020401030304020300040103000403030204030308040303020401030004010303
+04010300040103010403030104010301040103010403030a040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+0400030004000300040003000400030004000300040003080400030a040003050400030a
+040003660401032904000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+0400030004000300040003070400030a040003050400030a040003660401032a04000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+04000300040003000400030004000300040003000400030004000300040003080400030a
+04000305040c036604010329040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+04000300040003000400030004000307040c03a604000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+040003000400030004000300040003000400030004000300040003000400030004000300
+04000300040003000400030004000300040003ff03ff03d402ff02ff02bb00ff00ff00ba
+050000ff005b050100ff00ff000e050000ff005b050100b104a80502000204a8000504a8
+0502000204a8000504a80502000204a8000504a80502000204a8000504a80502000204a8
+000504a80502000204a8000504a80502000204a8000504a80502000204a8000504a80502
+000204a8000504a80502000204a8000504a80502000204a8000504a80502000204a80005
+04a8050200020407010404080100041601000404010004360100040601000433000504a8
+0502000204090100040a0100041c010004360100043b0005040801040434010004130100
+041a010004060100042b0502000204090100040301000400010104020100040001010403
+010204020100040001010403010204020104040201020402010004000101040301020403
+0102040a0102040201000400010104020104040201020403010204020100040001010403
+01020404010104170005040a01000436010004130100041a010004330502000204090100
+040301010401010004010101040101000401010004020100040101010401010004040100
+040401000403010004020100040101010401010004010100040201000401010004020100
+040801000402010004010101040101000403010004060100040201000402010004010101
+0401010004010100040201000403010104170005040a0100040301000400010104030102
+0403010204030102040a0102040201000402010004010104040101000400010104020100
+040201000401010404090102040201000400010104020104040201020403010204020100
+040001010403010204040101040f05020002040901000403010004020100040101000402
+010004010100040201000401010004080100040401000407010004010100040201000401
+010004050100040201000408010004020100040101000402010004030100040601000402
+01000402010004010100040201000401010004210005040a010004030101040101000401
+010004020100040101000402010004010100040201000408010004020100040101000402
+0100040301000403010104010100040101000402010004030100040a0100040201000401
+010104010100040301000406010004020100040201000401010104010100040101000402
+010004030101040f05020002040901000403010004020100040101000402010004010104
+040101000408010004040100040401030401010004020100040101000405010404080100
+040201000401010004020100040301000406010004020100040201000401010004020100
+04020102041e0005040a0100040301000409010004010100040501000402010004080100
+040201000401010004020100040301000403010004020100040101000402010004030100
+040a01000402010004010100040201000403010004060100040201000402010004010100
+040201000401010004190502000204090100040301000402010004010100040201000401
+010004050100040801000404010004030100040201000401010004020100040101000405
+0100040c0100040201000401010004020100040301000406010004020100040201000401
+01000402010004050100041d0005040a0100040301000406010304010100040501040408
+010004020100040101000402010004030100040301000402010004010100040201000403
+0100040a0100040201000401010004020100040301000406010004020100040201000401
+010004020100040201020416050200020409010004030100040201000401010004020100
+040101000402010004010100040801000404010004030100040201000401010004020100
+040101000402010004010100040201000408010004020100040101010401010004030100
+040601000402010004020100040101000402010004010100040201000403010104170005
+040a01000403010004050100040201000401010004050100040c01000402010004010100
+04020100040301000403010004020100040101000402010004030100040a010004020100
+040101000402010004030100040601000402010004020100040101000402010004050100
+041505020002040701040401010004020100040101000402010004020102040201000408
+0100040501010402010304010100040201000402010204030102040a0102040201000400
+01010405010104040100040301020402010004020100040201020404010104170005040a
+010004030100040501000402010004010100040201000401010004020100040801000402
+01000401010004010101040301000403010104010100040101000401010104030100040a
+010004020100040101010401010004030100040601000402010004020100040101000402
+0100040101000402010004030101040f050200020462010004440005040a010004030100
+040601030402010204030102040a01020403010104000100040401010401010004000101
+040301010400010004040101040901020402010004000101040501010404010004030102
+04020100040201000402010204040101040f050200020462010004440005044701000421
+0100043c0502000204620100044400050447010004210100043c0502000204a800050447
+010004210100043c0502000204a8000504a80502000204a8000504a80502000204a80005
+04a80502000204a8000504a80502000204a8000504a80502000204a8000504a805020002
+04a8000504a80502000204a8000504a80502000204a8000504a80502000204a8000504a8
+0502000204a8000504a80502000204a8000504a80502000204a8000504a80502000204a8
+000504a8050200020408050a04070104040801000416010004040100045f000504a80502
+000204080509000004090100040a0100041c0100045f000504a805020002040805010306
+000104090100040301000400010104020100040001010403010204020100040001010403
+010204020104040901020402010004000101040a01020402010004000101040301020402
+0100040201000401010004000101041f000504a805020002040805010306000104090100
+040301010401010004010101040101000401010004020100040101010401010004040100
+04040100040a010004020100040101010401010004080100040201000401010104010100
+040101000402010004010100040201000401010104010100041e00050409050a04070104
+043d01000447050200020408050103060001040901000403010004020100040101000402
+01000401010004020100040101000408010004040100040a010004020100040101000402
+010004080100040501000402010004050100040101000400010004000100040101000402
+0100041e000504090509000004090100043f010004470502000204080501030600010409
+01000403010004020100040101000402010004010104040101000408010004040100040a
+010004020100040101000402010004090102040201000402010004020103040101000400
+0100040001000401010004020100041e0005040905010306000104090100040301000400
+0101040301020403010204030102040a0102040301020402010004000101040301010400
+010004470502000204080501030600010409010004030100040201000401010004020100
+04010100040501000408010004040100040a0100040201000401010004020100040c0100
+040101000402010004010100040201000401010004000100040001000401010004020100
+041e00050409050103060001040901000403010104010100040101000402010004010100
+040201000401010004020100040801000402010004010100040201000401010104010100
+040101000401010104470502000204080501030600010409010004030100040201000401
+0100040201000401010004020100040101000408010004040100040a0100040201000401
+010004020100040801000402010004010101040101000401010004020100040101000400
+0100040001000401010004020100041e0005040905010306000104090100040301000409
+010004010100040501000402010004080100040501000402010004010100040201000401
+010004020100044705020002040805010306000104070104040101000402010004010100
+040201000402010204020100040801000405010104090102040201000402010004090102
+04020100040001010403010304020100040001000402010004020100041e000504090501
+030600010409010004030100040601030401010004050104040901020402010404010100
+040201000401010004020100044705020002040805010008045b01000437000504090501
+030600010409010004030100040501000402010004010100040501000410010004010100
+04050100040201000401010004020100044705020002040805000009045b010004370005
+040905010306000104090100040301000405010004020100040101000402010004010100
+040201000408010004020100040101000402010004010100040201000401010004010101
+044705020002046f01000437000504090501030600010409010004030100040601030402
+010204030102040a01020403010204020100040201000402010104000100044705020002
+04a8000504090501000804930502000204a8000504090500000904930502000204a80005
+04a80502000204a8000504a805020002041b0501048a000504a805020002041a0503040e
+01000404010204030102046a000504a80502000204190505040d01000406010004050100
+046a000504a8050200020418050203010502040b0100040001000405010004050100040a
+010204020100040001010403010204020100040201000401010004000101040301020439
+000504a8050200020417050203030502040a010004000100040501000405010004090100
+040201000401010104010100040101000402010004010100040201000401010104010100
+04010100040201000438000504a805020002041605020305050204090100040001000405
+010004050100040901000405010004020100040501000401010004000100040001000401
+01000402010004010100043c000504a80502000204150002030700020407010004020100
+0404010004050100040a0102040201000402010004020103040101000400010004000100
+0401010004020100040201020439000504a8050200020416000203050002040801040404
+010004050100040d01000401010004020100040101000402010004010100040001000400
+0100040101000402010004050100043800050409050a0407010404430100044105020002
+041700020303000204090100040201000404010004050100040901000402010004010101
+040101000401010004020100040101000400010004000100040101000402010004010100
+0402010004380005040905090000040901000488050200020418000203010002040a0100
+040201000404010004050100040a01020402010004000101040301030402010004000100
+040201000402010004020102043900050409050103060001040901000403010004000101
+040301020403010204030102040901000400010104030102040301020403010204030102
+04020100040201000402010204330502000204190005042e010004580005040905010306
+000104090100040301010401010004010100040201000401010004020100040101000402
+010004080101040101000401010004020100040101000402010004010100040201000404
+010004020100040201000401010004020100043205020002041a0003042f010004580005
+040905010306000104090100040301000409010004010100040501000402010004080100
+040501000402010004010100040501000402010004040100040201000402010004010100
+04020100043205020002041b000104300100045800050409050103060001040901000403
+010004060103040101000405010404080100040501040401010004050104040401000403
+0100040001000402010404320502000204a8000504090501030600010409010004030100
+04050100040201000401010004050100040c010004050100040501000405010004080100
+04030100040001000402010004360502000204a800050409050103060001040901000403
+010004050100040201000401010004020100040101000402010004080100040501000402
+010004010100040201000401010004020100040401000404010004030100040201000432
+0502000204a8000504090501030600010409010004030100040601030402010204030102
+0409010004060102040301020403010204050100040401000404010204330502000204a8
+000504090501000804930502000204a80005040905000009049305020002041b0001048a
+000504a805020002041a0003040c01040404010004120100044301020416000504a80502
+000204190005040b0100041c0100044501000416000504a8050200020418000204010002
+040a01000406010204020100040001010403010204020104040901020402010004000101
+0403010204020100040201000401010004000101040a0102040201000400010104050100
+0402010004020100040e000504a805020002041700020403000204090100040801000402
+010104010100040101000402010004030100040a01000402010004010101040101000401
+010004020100040101000402010004010101040101000408010004020100040101010401
+0100040401000402010004020100040e000504a805020002041600020405000204080103
+04050100040201000405010004070100040a010004050100040201000405010004010100
+040001000400010004010100040201000408010004020100040101000402010004040100
+0403010004010100040e000504a805020002041505020407050204070100040801000402
+01000406010204040100040b010204020100040201000402010304010100040001000400
+010004010100040201000408010004020100040101000402010004040100040301000401
+0100040e000504a805020002041605020405050204080100040801000402010004090100
+04030100040e010004010100040201000401010004020100040101000400010004000100
+040101000402010004080100040201000401010004020100040401000404010004000100
+040e000504a8050200020417050204030502040901000408010004020100040501000402
+010004030100040a01000402010004010101040101000401010004020100040101000400
+010004000100040101000402010004080100040201000401010004020100040401000404
+0101040f00050409000a04070104042701010418010004060100043a0502000204180502
+04010502040a010004080100040201000406010204050101040901020402010004000101
+040301030402010004000100040201000402010004090102040201000402010004040100
+04050100040f00050409000905000409010004280100041a010004420502000204190505
+043c010004390100040f0005040900010406050104090100040301000400010104030102
+0403010204030102040b0100040301000402010004010100040001010403010204020104
+0402010204030102040201000400010104030102042505020002041a0503043d01000436
+010004000100041000050409000104060501040901000403010104010100040101000402
+010004010100040201000401010004020100040801040401010004020100040101010401
+010004010100040201000403010004060100040201000402010004010101040101000401
+010004020100042405020002041b0501043e010004370100041100050409000104060501
+040901000403010004090100040101000405010004020100040a01000403010004020100
+040101000402010004010100040701000406010004020100040201000401010004020100
+0401010004280502000204a8000504090001040605010409010004030100040601030401
+010004050104040a01000403010004020100040101000402010004010100040701000406
+0100040201000402010004010100040201000402010204250502000204a8000504090001
+04060501040901000403010004050100040201000401010004050100040e010004030100
+040201000401010004020100040101000407010004060100040201000402010004010100
+040201000405010004240502000204a80005040900010406050104090100040301000405
+01000402010004010100040201000401010004020100040a010004030100040101010401
+010004020100040101000402010004030100040601000402010004020100040101000402
+0100040101000402010004240502000204a8000504090001040605010409010004030100
+040601030402010204030102040b01000404010104000100040101000402010004020102
+04050101040401000403010204020100040201000402010204250502000204a800050409
+0001050804930502000204a8000504090000050904930502000204a8000504a805020002
+04a8000504a80502000204a8000504a80502000204a8000504a80502000204a8000504a8
+0502000204a8000504a80502000204a8000504a80502000204a8000504a80502000204a8
+000504a80502000204a800050409000a040701040442010004420502000204a800050409
+00090500040901000444010004420502000204a800050409000104060501040901000403
+010004000101040301020403010204030102040a01020402010004020100040201020402
+0100040001010402010404020102043a0502000204a80005040900010406050104090100
+040301010401010004010100040201000401010004020100040101000402010004080100
+040201000401010004020100040101000402010004010101040101000403010004030100
+0402010004390502000204a8000504090001040605010409010004030100040901000401
+010004050100040201000408010004020100040101000402010004010100040201000401
+0100040201000403010004030100043d0502000204a80005040900010406050104090100
+040301000406010304010100040501040408010404020100040001000402010404010100
+040201000403010004040102043a0502000204a800050409000104060501040901000403
+010004050100040201000401010004050100040c01000406010004000100040201000405
+010004020100040301000407010004390502000204a80005040900010406050104090100
+040301000405010004020100040101000402010004010100040201000408010004020100
+040301000403010004020100040101000402010004030100040301000402010004390502
+00020408050a040701040408010004160100040401000420010204050100040901000429
+000504090001040605010409010004030100040601030402010204030102040a01020404
+01000404010204020100040201000404010104020102043a050200020408050900000409
+0100040a0100041c01000422010004100100042900050409000105080493050200020408
+050103060001040901000403010004000101040201000400010104030102040201000400
+01010403010204020104040901020402010004000101040c010004030102040201000400
+010104020100040101000426000504090000050904930502000204080501030600010409
+010004030101040101000401010104010100040101000402010004010101040101000404
+010004040100040a0100040201000401010104010100040b010004050100040201010401
+010004010100040001000427000504a80502000204080501030600010409010004030100
+0402010004010100040201000401010004020100040101000408010004040100040a0100
+040201000401010004020100040b01000405010004020100040201000401010104280005
+04a805020002040805010306000104090100040301000402010004010100040201000401
+0104040101000408010004040100040a0100040201000401010004020100040b01000405
+01000402010004020100040101010428000504a805020002040805010306000104090100
+0403010004020100040101000402010004010100040501000408010004040100040a0100
+040201000401010004020100040b01000405010004020100040201000401010004000100
+0427000504a8050200020408050103060001040901000403010004020100040101000402
+01000401010004020100040101000408010004040100040a010004020100040101000402
+0100040b010004050100040201000402010004010100040101000426000504a805020002
+040805010306000104070104040101000402010004010100040201000402010204020100
+0408010004050101040901020402010004020100040b0100040501000402010004020100
+04010100040201000425000504a8050200020408050100080494000504a8050200020408
+050000090494000504a80502000204a8000504a80502000204a8000504a80502000204a8
+000504a80502000204a8000504a80502000204a8000504a805020002041b0501048a0005
+04a805020002041a0503040e01000404010204030102040a01020405010004090100044a
+000504a80502000204190505040d01000406010004050100040c010004100100044a0005
+04a8050200020418050203010502040b0100040001000405010004050100040c01000403
+010204020100040001010402010004010100040301020440000504a80502000204170502
+03030502040a0100040001000405010004050100040c0100040501000402010104010100
+04010100040001000403010004020100043f000504a80502000204160502030505020409
+0100040001000405010004050100040c0100040501000402010004020100040101010404
+01000443000504a805020002041500020307000204070100040201000404010004050100
+040c010004050100040201000402010004010101040501020440000504a8050200020416
+000203050002040801040404010004050100040c01000405010004020100040201000401
+01000400010004070100043f000504a80502000204170002030300020409010004020100
+0404010004050100040c0100040501000402010004020100040101000401010004020100
+04020100043f000504a8050200020418000203010002040a010004020100040401000405
+0100040c01000405010004020100040201000401010004020100040201020440000504a8
+05020002041900050488000504a805020002041a00030489000504a805020002041b0001
+048a000504a80502000204a8000504a80502000204a8000504a80502000204a8000504a8
+0502000204a8000504a80502000204a8000504a805020002041b0001048a000504a80502
+0002041a0003040c01040404010004120100040b01020405010004090100041b0102041d
+000504a80502000204190005040b0100041c0100040d010004100100041d0100041d0005
+04a8050200020418000204010002040a0100040601020402010004000101040301020402
+0104040b01000403010204020100040001010402010004010100040a0102040201000400
+01010405010004020100040201000415000504a805020002041700020403000204090100
+040801000402010104010100040101000402010004030100040d01000405010004020101
+040101000401010004000100040a01000402010004010101040101000404010004020100
+040201000415000504a80502000204160002040500020408010304050100040201000405
+010004070100040d010004050100040201000402010004010101040b0100040201000401
+0100040201000404010004030100040101000415000504a8050200020415050204070502
+0407010004080100040201000406010204040100040d0100040501000402010004020100
+04010101040b010004020100040101000402010004040100040301000401010004150005
+04a80502000204160502040505020408010004080100040201000409010004030100040d
+01000405010004020100040201000401010004000100040a010004020100040101000402
+01000404010004040100040001000415000504a805020002041705020403050204090100
+0408010004020100040501000402010004030100040d0100040501000402010004020100
+040101000401010004090100040201000401010004020100040401000404010104160005
+04a8050200020418050204010502040a010004080100040201000406010204050101040b
+010004050100040201000402010004010100040201000409010204020100040201000404
+0100040501000416000504a80502000204190505047001000416000504a805020002041a
+0503046e0100040001000417000504a805020002041b0501047001000418000504a80502
+000204a8000504a80502000204a8000504a80502000204a8000504a80502000204a80005
+04a80502000204a8000504a80502000204a8000504a80502000204a8000504a805020002
+04a8000504a80502000204a8000504a80502000204a8000504a80502000204a8000504a8
+0502000204a8000504a80502000204a8000505ab000205a8000405ac000105a9000305ad
+000005aa00ff00ff00ff00ff001f04ff0457000504ff0457000504ff0457000504ff0457
+000504ff0457000504ff0457000504ff0457000504ff0457000504ff0457000504ff0457
+000504ff0457000504ff0457000504ff0457000504ff0457000504ff0457000504ff0457
+000504ff0457000504ff04570005040f01040434010004130100041a01000406010004d3
+0005041101000436010004130100041a010004db00050411010004030100040001010403
+01020403010204030102040a010204020100040201000401010404010100040001010402
+010004020100040101040409010204020100040001010402010404020102040301020402
+010004000101040301020404010104b70005041101000403010104010100040101000402
+010004010100040201000401010004020100040801000402010004010100040201000403
+01000403010104010100040101000402010004030100040a010004020100040101010401
+010004030100040601000402010004020100040101010401010004010100040201000403
+010104b70005041101000403010004090100040101000405010004020100040801000402
+01000401010004020100040301000403010004020100040101000402010004030100040a
+010004020100040101000402010004030100040601000402010004020100040101000402
+01000401010004c100050411010004030100040601030401010004050104040801000402
+01000401010004020100040301000403010004020100040101000402010004030100040a
+010004020100040101000402010004030100040601000402010004020100040101000402
+01000402010204be0005041101000403010004050100040201000401010004050100040c
+010004020100040101000402010004030100040301000402010004010100040201000403
+0100040a0100040201000401010004020100040301000406010004020100040201000401
+0100040201000405010004bd000504110100040301000405010004020100040101000402
+010004010100040201000408010004020100040101000401010104030100040301010401
+0100040101000401010104030100040a0100040201000401010104010100040301000406
+01000402010004020100040101000402010004010100040201000403010104b700050411
+010004030100040601030402010204030102040a01020403010104000100040401010401
+010004000101040301010400010004040101040901020402010004000101040501010404
+0100040301020402010004020100040201020404010104b70005044e01000421010004e4
+0005044e01000421010004e40005044e01000421010004e4000504ff0457000504ff0457
+000504ff0457000504ff0457000504ff0457000504ff0457000504ff0457000504ff0457
+000504ff0457000504ff0457000504ff0457000504ff0457000504ff0457000504ff0457
+000504ff0457000504ff0457000504ff0457000504ff0457000504ff0457000504ff0457
+000504ff0457000504ff045700050416050104ff043e000504150503040c010404190100
+040d010004ff0401000504140505040d0100042a010004ff040100050413050203010502
+040c01000403010004000101040901000402010004020102040201000400010104030101
+0400010004020102040201000402010004f300050412050203030502040b010004030101
+040101000408010004020100040401000402010104010100040101000401010104010100
+04020100040101000402010004f300050411050203050502040a01000403010004020100
+040801000400010004000100040401000402010004020100040101000402010004010100
+0402010004010100040001000400010004f3000504100002030700020409010004030100
+040201000408010004000100040001000404010004020100040201000401010004020100
+040101000402010004010100040001000400010004f300050411000203050002040a0100
+040301000402010004080100040001000400010004040100040201000402010004010100
+04020100040101000402010004010100040001000400010004f300050412000203030002
+040b01000403010004020100040801000400010004000100040401000402010004020100
+0401010004010101040101000402010004010100040001000400010004f3000504130002
+03010002040a010404010100040201000409010004000100040501000402010004020100
+040201010400010004020102040301000400010004f400050414000504ff043c00050415
+000304ff043d00050416000104ff043e000504ff0457000504ff0457000504ff04570005
+04ff0457000504ff0457000504ff040600470408000504ff040600460500040800050467
+058d0410000104430501040800050467058c000004100001044305010408000504670501
+048900010410000104430501040800050467050104890001041000010443050104080005
+04160001044e0501048900010410000104070602043805010408000504150003040c0104
+041201010404010004030102041905010489000104100001040706000401060004370501
+0408000504140005040d010004130100040d010004190501048900010410000104070600
+040106000402060004000601040306020402060004020600040206020403060204140501
+040800050413000204010002040c010004040102040b0100040401020405010004030102
+041205010489000104100001040706000401060004020601040106000401060004020600
+040106000402060004010600040206000401060004020600041305010408000504120002
+04030002040b010004030100040201000408010404040100040501000402010004020100
+041105010489000104100001040706030402060004050600040206000401060004000600
+0400060004010600040506000402060004130501040800050411000204050002040a0100
+0403010004020100040a0100040601000405010004020100040201000411050104890001
+041000010407060004020600040106000405060004020600040106000400060004000600
+040206020402060404130501040800050410050204070502040901000403010004020100
+040a01000406010004050100040201040411050104890001041000010407060004020600
+040106000405060004020600040106000400060004000600040506000401060004170501
+040800050411050204050502040a01000403010004020100040a01000406010004050100
+040201000415050104890001041000010407060004020600040106000405060004020600
+040106000400060004000600040106000402060004010600040206000403060104040601
+040406010501040800050412050204030502040b01000403010004020100040a01000406
+010004050100040201000402010004110501048900010410000104070603040206000406
+060204030600040006000403060204030602040406010404060104040601050104080005
+0413050204010502040c010004040102040b010004060100040501000403010204120501
+0489000104100001044305010408000504140505044c0501048900010410000104430501
+0408000504150503044d05010489000104100001044305010408000504160501044e0501
+048900010410000104430501040800050467050104890001041000010443050104080005
+04670501008b04100001044305010408000504670500008c041000010443050104080005
+04ff0406000105450408000504ff0406000005460408000504ff0457000504ff04570005
+04ff0457000504ff0457000504ff0457000504ff0457000504ff0457000504ff04570005
+04ff0457000504ff0457000504ff0457000504ff0457000504ff0457000504ff04570005
+04ff0457000504ff0457000504ff0457000505ff0557000405ff0558000305ff055900ff
+00ff00ff00ff001f04ff0457000504ff0457000504ff0457000504ff0457000504ff0457
+000504ff0457000504ff0457000504ff0457000504ff0457000504ff0457000504ff0457
+000504ff0457000504ff0457000504ff04570005044c003b044b003b04460005044c003a
+0500044b003a050004460005044c000104370501044b00010437050104460005044c0001
+04370501044b00010437050104460005044c000104370501044b00010437050104460005
+044c000104370501044b00010437050104460005044c000104370501044b000104370501
+04460005044c000104370501044b00010437050104460005044c000104370501044b0001
+0437050104460005044c000104150102040201000402010004160501044b000104070102
+041f01020409050104460005044c00010414010004020100040101000401010004170501
+044b00010406010004020100042001000409050104460005044c00010414010004020100
+040101000400010004180501044b00010406010004020100040201020402010004000101
+0403010204030102040501000409050104460005044c0001041401000402010004010101
+04190501044b000104060100040501000402010004010101040101000401010004020100
+0401010004020100040401000409050104460005044c0001041401000402010004010100
+0400010004180501044b0001040601000409010004010100040201000401010004050100
+04020100040401000409050104460005044c000104140100040201000401010004010100
+04170501044b000104060100040601030401010004020100040101000405010404040100
+0409050104460005044c00010414010004020100040101000401010004170501044b0001
+040601000402010004010100040201000401010004020100040101000405010004080100
+0409050104460005044c00010414010004020100040101000402010004160501044b0001
+040601000402010004010100040201000401010004020100040101000402010004010100
+04020100040401000409050104460005044c000104150102040201000402010004160501
+044b00010407010204030103040101000402010004020102040301020405010004090501
+04460005044c000104370501044b00010437050104460005044c000104370501044b0001
+0437050104460005044c000104370501044b00010437050104460005044c000104370501
+044b00010437050104460005044c000104370501044b00010437050104460005044c0001
+04370501044b00010437050104460005044c000104370501044b00010437050104460005
+044c000104370501044b00010437050104460005044c000104370501044b000104370501
+04460005044c000104370501044b00010437050104460005044c00010539044b00010539
+04460005044c0000053a044b0000053a0446000504ff0457000504ff0457000504ff0457
+000504ff0457000504ff0457000504ff045700010500000204ff045700000501000204ff
+0457
+%%EndData
+end
+%%PageTrailer
+%%Trailer
+%%BoundingBox: 0 53 250 318
+%%EOF
diff --git a/lib/pman/doc/src/part.xml b/lib/pman/doc/src/part.xml
new file mode 100644
index 0000000000..29b88e0785
--- /dev/null
+++ b/lib/pman/doc/src/part.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE part SYSTEM "part.dtd">
+
+<part xmlns:xi="http://www.w3.org/2001/XInclude">
+ <header>
+ <copyright>
+ <year>1996</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ The contents of this file are subject to the Erlang Public License,
+ Version 1.1, (the "License"); you may not use this file except in
+ compliance with the License. You should have received a copy of the
+ Erlang Public License along with this software. If not, it can be
+ retrieved online at http://www.erlang.org/.
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and limitations
+ under the License.
+
+ </legalnotice>
+
+ <title>Pman User's Guide</title>
+ <prepared></prepared>
+ <docno></docno>
+ <date></date>
+ <rev></rev>
+ </header>
+ <description>
+ <p>The process manager <em>Pman</em> is a graphical tool used to
+ inspect the Erlang processes executing either locally or on remote
+ nodes. It is also possible to trace events in the individual processes.</p>
+ </description>
+ <xi:include href="pman_chapter.xml"/>
+</part>
+
diff --git a/lib/pman/doc/src/part_notes.xml b/lib/pman/doc/src/part_notes.xml
new file mode 100644
index 0000000000..1505d52421
--- /dev/null
+++ b/lib/pman/doc/src/part_notes.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE part SYSTEM "part.dtd">
+
+<part xmlns:xi="http://www.w3.org/2001/XInclude">
+ <header>
+ <copyright>
+ <year>2004</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ The contents of this file are subject to the Erlang Public License,
+ Version 1.1, (the "License"); you may not use this file except in
+ compliance with the License. You should have received a copy of the
+ Erlang Public License along with this software. If not, it can be
+ retrieved online at http://www.erlang.org/.
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and limitations
+ under the License.
+
+ </legalnotice>
+
+ <title>Pman Release Notes</title>
+ <prepared></prepared>
+ <docno></docno>
+ <date>2004-09-07</date>
+ <rev>1.0</rev>
+ <file>part_notes.sgml</file>
+ </header>
+ <description>
+ <p>The process manager <em>Pman</em> is a graphical tool used to
+ inspect the Erlang processes executing either locally or on remote
+ nodes. It is also possible to trace events in the individual
+ processes.</p>
+ </description>
+ <xi:include href="notes.xml"/>
+</part>
+
diff --git a/lib/pman/doc/src/pman.xml b/lib/pman/doc/src/pman.xml
new file mode 100644
index 0000000000..2469d141e5
--- /dev/null
+++ b/lib/pman/doc/src/pman.xml
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE erlref SYSTEM "erlref.dtd">
+
+<erlref>
+ <header>
+ <copyright>
+ <year>1996</year>
+ <year>2007</year>
+ <holder>Ericsson AB, All Rights Reserved</holder>
+ </copyright>
+ <legalnotice>
+ The contents of this file are subject to the Erlang Public License,
+ Version 1.1, (the "License"); you may not use this file except in
+ compliance with the License. You should have received a copy of the
+ Erlang Public License along with this software. If not, it can be
+ retrieved online at http://www.erlang.org/.
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and limitations
+ under the License.
+
+ The Initial Developer of the Original Code is Ericsson AB.
+ </legalnotice>
+
+ <title>pman</title>
+ <prepared></prepared>
+ <docno></docno>
+ <date></date>
+ <rev></rev>
+ </header>
+ <module>pman</module>
+ <modulesummary>A graphical process manager.</modulesummary>
+ <description>
+ <p>A graphical tool used to inspect the Erlang processes executing either
+ locally or on remote nodes. It is also possible to trace events in
+ the individual processes.</p>
+ </description>
+ <funcs>
+ <func>
+ <name>start()</name>
+ <name>start(Excluded)</name>
+ <name>start_notimeout()</name>
+ <name>start_notimeout(Excluded)</name>
+ <fsummary>Start Pman.</fsummary>
+ <type>
+ <v>Excluded = [Module]</v>
+ <v>&nbsp;Module = atom()</v>
+ </type>
+ <desc>
+ <p>Starts Pman. It will use the previously saved trace settings
+ in <c>HOME/.erlang_tools/pman.opts</c>, where <c>HOME</c> is
+ the user's home directory, if such a file exists. Otherwise
+ standard trace settings will be used. The return value should
+ be ignored.</p>
+ <p><c>Excluded</c> is a list of module names. If the argument is
+ present, processes currently executing in any of these modules
+ will not be shown by Pman.</p>
+ <p><c>start/0,1</c> will fail unless the start-up succeeds
+ within 20 seconds, whereas <c>start_notimeout/0,1</c> will
+ wait indefinitely.</p>
+ </desc>
+ </func>
+ <func>
+ <name>proc(Process)</name>
+ <name>proc(A, B, C)</name>
+ <fsummary>Start a Pman trace window.</fsummary>
+ <type>
+ <v>Process = pid() | atom()</v>
+ <v>A = B = C = integer()</v>
+ </type>
+ <desc>
+ <p>Starts a Pman trace window for the specified process.
+ The return value should be ignored.</p>
+ <p>The process to trace is given either by its pid or by its
+ registered name. It is also possible to use <c>proc/3</c>
+ to trace the pid represented as <c><![CDATA[<A,B,C>]]></c>.</p>
+ </desc>
+ </func>
+ </funcs>
+</erlref>
+
diff --git a/lib/pman/doc/src/pman_chapter.xml b/lib/pman/doc/src/pman_chapter.xml
new file mode 100644
index 0000000000..141b488415
--- /dev/null
+++ b/lib/pman/doc/src/pman_chapter.xml
@@ -0,0 +1,371 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE chapter SYSTEM "chapter.dtd">
+
+<chapter>
+ <header>
+ <copyright>
+ <year>1996</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ The contents of this file are subject to the Erlang Public License,
+ Version 1.1, (the "License"); you may not use this file except in
+ compliance with the License. You should have received a copy of the
+ Erlang Public License along with this software. If not, it can be
+ retrieved online at http://www.erlang.org/.
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and limitations
+ under the License.
+
+ </legalnotice>
+
+ <title>Pman</title>
+ <prepared></prepared>
+ <docno></docno>
+ <date></date>
+ <rev></rev>
+ <file>pman_chapter.xml</file>
+ </header>
+ <marker id="here"></marker>
+
+ <section>
+ <title>Introduction</title>
+ <p>The process manager Pman is a tool for viewing processes executing
+ locally or on remote nodes. Its main purpose is to locate
+ erroneous code by inspecting the state of the processes and by tracing
+ events. Bottlenecks, unread messages, and bad memory handling are
+ some of the problems that can be solved with Pman.</p>
+ <p>Processes may be inspected individually in a process trace
+ window. There the user may dynamically follow the execution of a
+ process by getting trace output for sent and received messages
+ as well as for called functions and some other process
+ events. Information about source code modules executed by the
+ processes is also accessible. Note that Pman has some effect on
+ the real time behavior of a running system.</p>
+ </section>
+
+ <section>
+ <title>Getting Started with Pman</title>
+ <p>Start Pman by calling <c>pman:start()</c>. It will start
+ the <seealso marker="#main_win">Main Window</seealso>, showing an
+ overview of all processes running at the current node.</p>
+ <p>To trace a certain process, select it by clicking on its line and
+ then chose Trace-&gt;Selected Process, or simply double-click it. This
+ will open a <seealso marker="#trace_win">Trace Window</seealso>.
+ In the Trace Window, there is some information about the process
+ and traced events are added dynamically.</p>
+ <p>Which events to trace are selected in
+ the <seealso marker="#options_win">Options Window</seealso> which
+ is opened by choosing File-&gt;Options... in the Main Window or in a
+ Trace Window. Currently supported trace events are message sending,
+ message receiving, function calls and process events.</p>
+ <p>It is possible to by-pass the Main Window and open a Trace
+ Window directly for the process <c>Pid</c> by calling
+ <c>pman:proc(Pid)</c>.</p>
+ </section>
+
+ <section>
+ <marker id="main_win"></marker>
+ <title>The Main Window</title>
+ <p>The Main Window shows all processes running at the displayed node.
+ The window is automatically updated every 5 seconds.
+ Select which node to display in the window by choosing the node name
+ from the Nodes menu.</p>
+ <image file="main_window.gif">
+ <icaption>The Main Window.</icaption>
+ </image>
+ <p>A process can be selected by clicking on its line. The selected
+ process is highlighted. Use the arrow keys to move up and down in
+ the process overview.</p>
+ <p>The following information is displayed for each process:</p>
+ <list type="bulleted">
+ <item>Pid - process identifier.</item>
+ <item>Current Function - the function (<c>Module:Function/Arity</c>)
+ the process is currently executing.</item>
+ <item>Name - registered name of the process, if any.</item>
+ <item>Msgs - number of messages in the process' mailbox.</item>
+ <item>Reds - number of reductions performed. Gives a rough estimate
+ of the process' work load.</item>
+ <item>Size - estimated size of the process, in words, calculated by
+ adding the stack size and the heap size.</item>
+ </list>
+ <p>At the bottom of the window the following functions and
+ information can be found:</p>
+ <taglist>
+ <tag><em>Hide System Processes</em></tag>
+ <item>This check button controls the display of what Pman consider
+ <em>system processes</em>, that is, processes Pman knows are part
+ of Erlang/OTP rather than the user's application.
+ If the button is selected, these system processes will not be
+ shown.</item>
+ <tag><em>Auto-Hide New</em></tag>
+ <item>This check button controls the treatment of newly created
+ processes. If it is selected, new processes will not be shown.</item>
+ <tag><em># Hidden</em></tag>
+ <item>This label displays the number of processes currently
+ executing that are not shown in the process overview.</item>
+ </taglist>
+
+ <section>
+ <title>The File Menu</title>
+ <taglist>
+ <tag><em>Options...</em></tag>
+ <item>Open the <seealso marker="#options_win">Options Window</seealso>
+ which allows the user to set the trace options to use.</item>
+ <tag><em>Save Options</em></tag>
+ <item>Save the options set using the Options Window. The options are
+ stored to the file <c>HOME/.erlang_tools/pman.opts</c>, where
+ <c>HOME</c> is the user's home directory, and are automatically
+ loaded the next time Pman is started.</item>
+ <tag><em>Exit</em></tag>
+ <item>Stop Pman.</item>
+ </taglist>
+ </section>
+
+ <section>
+ <title>The View Menu</title>
+ <p>This menu mainly contains buttons for controlling what to
+ display in the Main Window. Note that the View Menu overrides
+ the settings of the check buttons (Hide System processes, Auto-Hide
+ new) in the Main Window.</p>
+ <taglist>
+ <tag><em>Hide All Processes</em></tag>
+ <item>Hide all processes.</item>
+ <tag><em>Hide Modules...</em></tag>
+ <item>Opens a dialog window with all loaded modules. If the user
+ selects a window and clicks OK, the process overview will not
+ show any processes running code from those modules.</item>
+ <tag><em>Hide Selected Processs</em></tag>
+ <item>Hide the selected process.</item>
+ <tag><em>Module Info...</em></tag>
+ <item>Given a selected process currently executing a function in
+ the module <c>Module</c>, this menu button opens a window
+ showing information about the module as returned from
+ <c>Module:module_info()</c>.</item>
+ <tag><em>Refresh</em></tag>
+ <item>Updates the process overview.</item>
+ <tag><em>Show All Processes</em></tag>
+ <item>Show all processes, except system processes and/or new
+ processes if <em>Hide System Processes</em> and/or
+ <em>Auto-Hide New</em> is selected.</item>
+ <tag><em>Show Processes...</em></tag>
+ <item>Opens a dialog window with all hidden processes. If
+ the user selects a process and clicks OK, the process
+ overview will show that process.</item>
+ </taglist>
+ </section>
+
+ <section>
+ <title>The Trace Menu</title>
+ <taglist>
+ <tag><em>Kill</em></tag>
+ <item>Terminates the selected process by calling
+ <c>exit(Pid,kill)</c>.</item>
+ <tag><em>Trace Selected Process</em></tag>
+ <item>Opens a Trace Window for the selected process. Tracing
+ will start immediately with the default trace flags set from
+ the Main Window.</item>
+ <tag><em>Shell Process</em></tag>
+ <item>Opens a Trace Window for the shell process of node Pman
+ was started at (not the displayed node). If the shell process
+ dies, the opened Trace Window will find the pid of
+ the automatically started new shell process, and continue to
+ trace that process.</item>
+ </taglist>
+ </section>
+
+ <section>
+ <title>The Nodes Menu</title>
+ <p>The Nodes menu contains one entry for each known node.
+ By selecting a node from the Nodes menu, the process overview
+ window will change its view, and display the processes running
+ on that node.</p>
+ </section>
+
+ <section>
+ <title>The Help Menu</title>
+ <taglist>
+ <tag><em>Help</em></tag>
+ <item>Selecting Help from the Help menu will cause the HTML
+ version of the Pman User's Guide (this document) to be
+ displayed. Currently this function requires Netscape to be up
+ and running.</item>
+ </taglist>
+ </section>
+ </section>
+
+ <section>
+ <marker id="trace_win"></marker>
+ <title>The Trace Window</title>
+ <p>A Trace Window outputs trace information for a traced process.
+ A Trace Window automatically uses the trace options set in
+ the Main Window, but it is also possible to change the options for
+ each Trace Window individually.</p>
+ <image file="trace.gif">
+ <icaption>The Trace Window.</icaption>
+ </image>
+ <p>There is no limit to how many Trace Windows can be open at the same
+ time. However, notice that if more processes are traced,
+ the performance degradation of the system will be more noticeable.</p>
+ <p>The following information is displayed, where applicable:</p>
+ <list type="bulleted">
+ <item>initial call - the function (<c>Module:Function/Arity</c>)
+ the process started executing in.</item>
+ <item>current function - the function (<c>Module:Function/Arity</c>)
+ the process is currently executing.</item>
+ <item>messages - the messages in the mailbox.</item>
+ <item>dictionary - the contents of the process dictionary.</item>
+ <item>heap size - heap size in words.</item>
+ <item>stack size - stack size in words.</item>
+ <item>reductions - number of reductions performed. Gives a rough
+ estimate of the process' work load.</item>
+ <item>links - list of pids the process is linked to.</item>
+ <item>trap_exit - <c>true</c> if the process trap exit signals,
+ <c>false</c> otherwise.</item>
+ </list>
+ <p>In the Trace Window, trace output is continuously added. First in
+ each trace message is the pid of the traced process.
+ Note that if the inheritance flags for tracing are set, the trace
+ output for the spawned/linked processes will be shown in the same
+ window as the spawning/linking process.</p>
+ <p>Each trace message also has a mnemonic tag:</p>
+ <taglist>
+ <tag><em>!</em></tag>
+ <item>This tag indicates that a message has been sent. Following
+ the <c>To:</c> tag will be a pid/name of the receiver. Next,
+ following the <c>Msg:</c> tag will be the sent message.</item>
+ <tag><em>rec</em></tag>
+ <item>This tag indicates that a message has been received.
+ Following this will be the received message.</item>
+ <tag><em>call</em></tag>
+ <item>This tag indicates a call to a function. Following this will be
+ the actual call, with all the arguments.</item>
+ <tag><em>link</em></tag>
+ <item>This tag indicates that a link between the traced process and
+ another process has been created. Following this will be the pid
+ of the other process.</item>
+ <tag><em>spawn</em></tag>
+ <item>This tag indicates that the traced process has spawned another
+ process. Following this will be the pid of the spawned process.</item>
+ <tag><em>exit</em></tag>
+ <item>This tag indicates that traced process has exited. Following
+ this will be the exit reason.</item>
+ </taglist>
+
+ <section>
+ <title>The File Menu</title>
+ <taglist>
+ <tag><em>Options...</em></tag>
+ <item>Opens the <seealso marker="#options_win">Options Window</seealso>
+ which allows the user to set the trace options to use for this
+ specific Trace Window.</item>
+ <tag><em>Save Buffer...</em></tag>
+ <item>Opens a dialog that prompts the user for a file name to
+ save the current Trace Window contents in.</item>
+ <tag><em>Close</em></tag>
+ <item>Stops tracing of the process, and closes the Trace Window.</item>
+ </taglist>
+ </section>
+
+ <section>
+ <title>The View Menu</title>
+ <taglist>
+ <tag><em>Clear Buffer</em></tag>
+ <item>Clears the contents of the Trace Window.</item>
+ <tag><em>Module Info</em></tag>
+ <item>Opens a window showing information about the module
+ the process is currently executing code from, as returned from
+ <c>Module:module_info()</c>.</item>
+ </taglist>
+ </section>
+
+ <section>
+ <title>The Trace Menu</title>
+ <taglist>
+ <tag><em>All Linked Processes</em></tag>
+ <item>Opens a Trace Window for each of the processes linked to the
+ process being traced in the current Trace Window.</item>
+ <tag><em>Linked Process -></em></tag>
+ <item>The Linked Process submenu has one entry for each process
+ linked to the process being traced in the current Trace Window.
+ Select one of the processes to open a new Trace Window for that
+ process.</item>
+ <tag><em>Kill</em></tag>
+ <item>Terminates the process being traced in the current Trace
+ Window by calling <c>exit(Pid,kill)</c>.</item>
+ </taglist>
+ </section>
+
+ <section>
+ <title>The Help Menu</title>
+ <taglist>
+ <tag><em>Help</em></tag>
+ <item>Selecting Help from the Help menu will cause the HTML version
+ of the Pman User's Guide (this document) to be displayed.
+ Currently this function requires Netscape to be up and running.</item>
+ </taglist>
+ </section>
+ </section>
+
+ <section>
+ <marker id="options_win"></marker>
+ <title>The Options Window</title>
+ <p>The Options Window allows the user to specify the amount of output,
+ and the destination of output for traced processes.</p>
+ <image file="options.gif">
+ <icaption>The Options Window.</icaption>
+ </image>
+ <p>In the upper left corner of the Options Window, there are check
+ buttons for determining what to output in the Trace Window:</p>
+ <taglist>
+ <tag><em>Trace send</em></tag>
+ <item>Select this check button to display information about sent
+ messages.</item>
+ <tag><em>Trace receive</em></tag>
+ <item>Select this check button to display information about received
+ messages.</item>
+ <tag><em>Trace functions</em></tag>
+ <item>Select this check button to display information about
+ function calls.</item>
+ <tag><em>Trace events</em></tag>
+ <item>Select this check button to display information about process
+ events, such as spawn, link and exit.</item>
+ </taglist>
+ <p>In the upper right corner of the dialog, there are options for
+ controlling the behaviour of spawned or linked processes:</p>
+ <taglist>
+ <tag><em>Inherit on spawn</em></tag>
+ <item>
+ <p>The user may select if spawned processes shall also be traced.
+ And if so, if all spawned processes should be traced, or just
+ the first spawned process.</p>
+ <p>If a spawned process is traced, it will get the same trace
+ options that are set for the spawning process. And the output
+ will be shown in the same Trace Window as that of the spawning
+ process.</p>
+ <p>.</p>
+ </item>
+ <tag><em>Inherit on link</em></tag>
+ <item>
+ <p>The user may select if a process that is being linked to
+ shall be traced. And if so, if all linked processes shall be
+ traced, or just the first one linked to.</p>
+ <p>If a linked process is traced, it will get the same trace
+ options that are set for the linking process. And the output
+ will be shown in the same Trace Window as that of the linked
+ process.</p>
+ </item>
+ </taglist>
+ <p>In the lower part of the Options Dialog, the user may select
+ whether the trace information shall be output to a file, or appear in
+ the trace window.</p>
+ <p>Sending trace information to a file is more efficient than displaying
+ it in the Trace Window. Furthermore, if the amount of trace data is
+ large, it will not be lost if tracing to a file. The trace information
+ in the Trace Window has an upper limit (approx. 10,000 lines), after
+ which the output buffer will be cleared.</p>
+ </section>
+</chapter>
+
diff --git a/lib/pman/doc/src/ref_man.xml b/lib/pman/doc/src/ref_man.xml
new file mode 100644
index 0000000000..4deb1d9b3d
--- /dev/null
+++ b/lib/pman/doc/src/ref_man.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE application SYSTEM "application.dtd">
+
+<application xmlns:xi="http://www.w3.org/2001/XInclude">
+ <header>
+ <copyright>
+ <year>1996</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ The contents of this file are subject to the Erlang Public License,
+ Version 1.1, (the "License"); you may not use this file except in
+ compliance with the License. You should have received a copy of the
+ Erlang Public License along with this software. If not, it can be
+ retrieved online at http://www.erlang.org/.
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and limitations
+ under the License.
+
+ </legalnotice>
+
+ <title>Pman Reference Manual</title>
+ <prepared></prepared>
+ <docno></docno>
+ <date></date>
+ <rev></rev>
+ </header>
+ <description>
+ <p>The process manager <em>Pman</em> is a graphical tool used to
+ inspect the Erlang processes executing either locally or on remote
+ nodes. It is also possible to trace events in the individual processes.</p>
+ </description>
+ <xi:include href="pman.xml"/>
+</application>
+
diff --git a/lib/pman/doc/src/toolbar.gif b/lib/pman/doc/src/toolbar.gif
new file mode 100644
index 0000000000..116e32ace8
--- /dev/null
+++ b/lib/pman/doc/src/toolbar.gif
Binary files differ
diff --git a/lib/pman/doc/src/trace.gif b/lib/pman/doc/src/trace.gif
new file mode 100644
index 0000000000..8b34ec7ea0
--- /dev/null
+++ b/lib/pman/doc/src/trace.gif
Binary files differ
diff --git a/lib/pman/doc/src/trace.ps b/lib/pman/doc/src/trace.ps
new file mode 100644
index 0000000000..0828d4ade1
--- /dev/null
+++ b/lib/pman/doc/src/trace.ps
@@ -0,0 +1,1312 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: (ImageMagick)
+%%Title: (./trace.tmp.eps)
+%%CreationDate: (Tue Jun 12 18:05:00 2001)
+%%BoundingBox: 0 17 377 309
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 1
+%%Pages: 0
+%%EndComments
+
+%%BeginDefaults
+%%PageOrientation: Portrait
+%%EndDefaults
+
+%%BeginProlog
+%
+% Display a color image. The image is displayed in color on
+% Postscript viewers or printers that support color, otherwise
+% it is displayed as grayscale.
+%
+/buffer 512 string def
+/byte 1 string def
+/color_packet 3 string def
+/pixels 768 string def
+
+/DirectClassPacket
+{
+ %
+ % Get a DirectClass packet.
+ %
+ % Parameters:
+ % red.
+ % green.
+ % blue.
+ % length: number of pixels minus one of this color (optional).
+ %
+ currentfile color_packet readhexstring pop pop
+ compression 0 gt
+ {
+ /number_pixels 3 def
+ }
+ {
+ currentfile byte readhexstring pop 0 get
+ /number_pixels exch 1 add 3 mul def
+ } ifelse
+ 0 3 number_pixels 1 sub
+ {
+ pixels exch color_packet putinterval
+ } for
+ pixels 0 number_pixels getinterval
+} bind def
+
+/DirectClassImage
+{
+ %
+ % Display a DirectClass image.
+ %
+ systemdict /colorimage known
+ {
+ columns rows 8
+ [
+ columns 0 0
+ rows neg 0 rows
+ ]
+ { DirectClassPacket } false 3 colorimage
+ }
+ {
+ %
+ % No colorimage operator; convert to grayscale.
+ %
+ columns rows 8
+ [
+ columns 0 0
+ rows neg 0 rows
+ ]
+ { GrayDirectClassPacket } image
+ } ifelse
+} bind def
+
+/GrayDirectClassPacket
+{
+ %
+ % Get a DirectClass packet; convert to grayscale.
+ %
+ % Parameters:
+ % red
+ % green
+ % blue
+ % length: number of pixels minus one of this color (optional).
+ %
+ currentfile color_packet readhexstring pop pop
+ color_packet 0 get 0.299 mul
+ color_packet 1 get 0.587 mul add
+ color_packet 2 get 0.114 mul add
+ cvi
+ /gray_packet exch def
+ compression 0 gt
+ {
+ /number_pixels 1 def
+ }
+ {
+ currentfile byte readhexstring pop 0 get
+ /number_pixels exch 1 add def
+ } ifelse
+ 0 1 number_pixels 1 sub
+ {
+ pixels exch gray_packet put
+ } for
+ pixels 0 number_pixels getinterval
+} bind def
+
+/GrayPseudoClassPacket
+{
+ %
+ % Get a PseudoClass packet; convert to grayscale.
+ %
+ % Parameters:
+ % index: index into the colormap.
+ % length: number of pixels minus one of this color (optional).
+ %
+ currentfile byte readhexstring pop 0 get
+ /offset exch 3 mul def
+ /color_packet colormap offset 3 getinterval def
+ color_packet 0 get 0.299 mul
+ color_packet 1 get 0.587 mul add
+ color_packet 2 get 0.114 mul add
+ cvi
+ /gray_packet exch def
+ compression 0 gt
+ {
+ /number_pixels 1 def
+ }
+ {
+ currentfile byte readhexstring pop 0 get
+ /number_pixels exch 1 add def
+ } ifelse
+ 0 1 number_pixels 1 sub
+ {
+ pixels exch gray_packet put
+ } for
+ pixels 0 number_pixels getinterval
+} bind def
+
+/PseudoClassPacket
+{
+ %
+ % Get a PseudoClass packet.
+ %
+ % Parameters:
+ % index: index into the colormap.
+ % length: number of pixels minus one of this color (optional).
+ %
+ currentfile byte readhexstring pop 0 get
+ /offset exch 3 mul def
+ /color_packet colormap offset 3 getinterval def
+ compression 0 gt
+ {
+ /number_pixels 3 def
+ }
+ {
+ currentfile byte readhexstring pop 0 get
+ /number_pixels exch 1 add 3 mul def
+ } ifelse
+ 0 3 number_pixels 1 sub
+ {
+ pixels exch color_packet putinterval
+ } for
+ pixels 0 number_pixels getinterval
+} bind def
+
+/PseudoClassImage
+{
+ %
+ % Display a PseudoClass image.
+ %
+ % Parameters:
+ % class: 0-PseudoClass or 1-Grayscale.
+ %
+ currentfile buffer readline pop
+ token pop /class exch def pop
+ class 0 gt
+ {
+ currentfile buffer readline pop
+ token pop /depth exch def pop
+ /grays columns 8 add depth sub depth mul 8 idiv string def
+ columns rows depth
+ [
+ columns 0 0
+ rows neg 0 rows
+ ]
+ { currentfile grays readhexstring pop } image
+ }
+ {
+ %
+ % Parameters:
+ % colors: number of colors in the colormap.
+ % colormap: red, green, blue color packets.
+ %
+ currentfile buffer readline pop
+ token pop /colors exch def pop
+ /colors colors 3 mul def
+ /colormap colors string def
+ currentfile colormap readhexstring pop pop
+ systemdict /colorimage known
+ {
+ columns rows 8
+ [
+ columns 0 0
+ rows neg 0 rows
+ ]
+ { PseudoClassPacket } false 3 colorimage
+ }
+ {
+ %
+ % No colorimage operator; convert to grayscale.
+ %
+ columns rows 8
+ [
+ columns 0 0
+ rows neg 0 rows
+ ]
+ { GrayPseudoClassPacket } image
+ } ifelse
+ } ifelse
+} bind def
+
+/DisplayImage
+{
+ %
+ % Display a DirectClass or PseudoClass image.
+ %
+ % Parameters:
+ % x & y translation.
+ % x & y scale.
+ % label pointsize.
+ % image label.
+ % image columns & rows.
+ % class: 0-DirectClass or 1-PseudoClass.
+ % compression: 0-RunlengthEncodedCompression or 1-NoCompression.
+ % hex color packets.
+ %
+ gsave
+ currentfile buffer readline pop
+ token pop /x exch def
+ token pop /y exch def pop
+ x y translate
+ currentfile buffer readline pop
+ token pop /x exch def
+ token pop /y exch def pop
+ currentfile buffer readline pop
+ token pop /pointsize exch def pop
+ /Helvetica findfont pointsize scalefont setfont
+ x y scale
+ currentfile buffer readline pop
+ token pop /columns exch def
+ token pop /rows exch def pop
+ currentfile buffer readline pop
+ token pop /class exch def pop
+ currentfile buffer readline pop
+ token pop /compression exch def pop
+ class 0 gt { PseudoClassImage } { DirectClassImage } ifelse
+ grestore
+} bind def
+%%EndProlog
+%%Page: 1 1
+%%PageBoundingBox: 0 17 377 309
+userdict begin
+%%BeginData:
+DisplayImage
+0 17
+377.000000 292.000000
+12
+562 436
+1
+0
+0
+8
+ffffff
+000000
+b24d7a
+dcadc2
+57253b
+d9d9d9
+c3c3c3
+828282
+03ff03ff034e040003ff03f40400031c04000301021a0400030002ff02f304000300021a
+04010301021a0400030002ff02f304000300021a04010301021a0400030002ff02f30400
+0300021a0401030102020418030004ff04f4030004170202040103010202040003ff03ff
+032602020401030102020400030002150400030002ff02db040003000215040003000215
+0400030002020401030102020400030002150400030002ff02db04000300021504000300
+02150400030002020401030102020400030002150400030002ff02db0400030002150400
+030002150400030002020401030102020400030002150400030002ff02db040003000215
+040003000202030f02020400030002020401030102020400030002150400030002ff0263
+000302730400030002150400030002020300020d04000202040003000202040103010202
+04000300021504000300021f000602020001020600010206000102060001020500000209
+0004020100010211000102020001025a0002020a000502040004020c0002022f00010205
+00000212000102110001021b0004020d000102080001023a040003000215040003000202
+0300020d0400020204000300020204010301020204000300021504000300021f00010202
+000202010002020400020205000202060002020400000207000202020000020100010211
+000102020001025800010202000102080000020200020203000002020001020900010202
+0001022d00020204000002120001021100010219000102040000020c000102080001023a
+0400030002150400030002020300020d0400020204000300020204010301020204000300
+021504000300021f00010203000102010002020400020205000002000001020500020204
+0000020700010206000102110001020200010258000102020001020d0001020800010208
+000102020001022d00020204000002120001021100010218000002070000020b00010245
+0400030002150400030002020300020d0400020204000300020204010301020204000300
+021504000300021f00010203000102010000020000000203000302050000020000010205
+000002000001020300000203000102010001020600010200000302050003020200010202
+000102080001020000020204000102000001020200040204000402030003020300040203
+0004020f00000201000102040001020c0001020800010207000102040001020000000211
+000402020001020000030209000002000001020300000204000402040002020000010204
+000302070004020200040204000402030000020300030201000002030004020100010200
+00030203000102010001020400000202000402030004021f040003000215040003000202
+0300020d04000202040003000202040103010202040003000202030f020204000300021f
+000102030001020100000200000102020000020000010204000102000001020500000200
+000202020000020300010201000302040002020200010203000102010001020100010202
+000102080002020100010203000202030001020200010202000102060001020100010201
+000102060001021100010202000102040001020b00010209000102070001020400010201
+0001020e0001020200010201000202020001020800000200000202020000020300010202
+000102020001020100020203000102010001020700010203000102020001020200010202
+000102020000020100010202000002010000020200010205000202020001020200010202
+000002040000020200000202000102010001022304000300020803030208040003000202
+0300020d040002020400030002020401030102020400030002020300020d040002020400
+0300021f0001020200010202000002000001020200000200000102040000020200010204
+000002010001020200000208000402020001020300010202000102030001020000010202
+000102080001020300010202000102030001020400010200000102060001020300010200
+000102060001020f0001020400010204000102080002020a000102080001020400010203
+0001020b0001020400010200000102030001020800000201000102020000020200010204
+000102000001020300010202000102030001020600010202000102040001020000010204
+000102000000020200000202000102010000020100010206000102030001020200010202
+000102020000020700010201000102230400030002080300020104000208040003000202
+0300020d040002020400030002020401030102020400030002020300020d040002020400
+0300021f0005020300000201000102000000020100010203000102020001020400000202
+000102010000020a00030201000102030001020200010203000102000001020200010208
+000102030001020200010203000102040001020000010206000102030001020000030204
+0003020a00020206000102040001020b0001020800000209000102040001020500020208
+000102040001020000010203000102080000020200010201000002020001020400010200
+000102030001020200010203000102060001020200010204000102000001020400010200
+000002010000020200010202000002010001020600010203000102020001020200010202
+00000207000102010003022104000300020803000201040002080400030002020300020d
+040002020400030002020401030102020400030002020300040e020204000300021f0001
+020700000201000102000000020100010203000102020002020300000202000202000000
+020c00020200000102030001020200070200000102020001020800010203000102020001
+020300010204000102000001020600070202000302040003020600020208000102040001
+020c000102060000020a0001020400010207000202060001020400010200000102030001
+020800000202000202000000020200010204000102000001020300010202000702060001
+020200010204000102000001020400010200000002010000020100020201000102010001
+02060001020300010202000102030000020100010204000402030003021f040003000208
+0300040202080400030002020300020d0400020204000300020204010301020204000300
+021504000300021f00010207000002010001020000000201000102030007020300000203
+000102000000020d00010200000102030001020200010206000102020001020800010203
+00010202000102030001020400010200000102060001020a000202050002020700020206
+000102040001020c000102050000020b0001020400010205000202080001020400010200
+000102030001020800000203000102000000020200010204000102000001020300010202
+0001020c0001020200010204000102000001020400010200000002010000020100000200
+000002010000020200010206000102030001020200010203000102000000020300020201
+000102050002021e0400030002150400030002020300020d040002020400030002020401
+0301020204000300021504000300021f0001020700000202000102020001020200010204
+00010203000002040002020d000102000001020300010202000102060001020200010208
+0001020300010202000102030001020400010200000102060001020b000102060001020a
+00010205000102020001020d000102040000020d00010202000102040001020b00010204
+000102000001020300010208000002040002020200010204000102000001020300010202
+0001020c0001020200010204000102000001020400010201000002000002020100020203
+00010206000102030001020200010203000102000000020300010202000102060001021e
+0400030002150400030002020300020d0400020204000300020204010301020204000300
+021504000300021f00010207000002020001020200010202000002060001020200000204
+000202030001020100000203000102010001020300010203000102030000020000010202
+000102080002020100010203000102040001020200010202000102020000020200010203
+000002000000020300010201000002030001020c00010203000102020001020300010202
+0000020200010204000102080001020200010202000102020001020e0001020200010201
+000102030001020800000204000202030001020200010202000102010002020300010203
+000002060001020300010202000102020001020200010202000102030000020700010202
+00000201000102030001020200010204000102040001020200010201000002030001021e
+0400030002150400030002020300020d0400020204000300020204010301020204000300
+021504000300021f00010207000002070001020100010206000102020000020500010203
+000102010005020200010203000102050004020000010202000102080001020000020204
+00010205000402040004020400040200000502020005020f000002040002020500010202
+000402050006020300010204000202030000021100040202000102030001020800000205
+000102040004020400020200000102050004020600010204000402040004020500030209
+000402010001020300010202000102040001020500030200000102000005021f04000300
+02150400030002020300020d040002020400030002020401030102020400030002150400
+03000282000102ff02560400030002150400030002020300020d04000202040003000202
+040103010202040003000215040003000282000102ff0256040003000215040003000202
+0300040e0202040003000202040103010202040003000215040003000282000102ff0256
+0400030002150400030002150400030002020401030102020400030002150400030002ff
+02db04000300021504000300021504000300020204010301020204000300021504000300
+02ff02db04000300021504000300021504000300020204010300040403000416030004ff
+04dc030004160300041603000404030500ff00ff00250304040003010202040000ff00ff
+00240700030002020401030102020400000105ff05ff0521070103000202040103010202
+0400000105ff05ff05210701030002020401030102020400000105ff05ff052107010300
+02020401030102020400000105ff05ff05210701030002020401030102020400000105ff
+05ff052107010300020204010301020204000001050b01040504010005030102051f0100
+05020100050401000526010405ff05860100050201000509010205130701030002020401
+0301020204000001050b0100050f0100051f010005020100052e010005ff058801000502
+0100050b0100051307010300020204010301020204000001050b01000506010205050100
+050301020518010005020100050201020503010205020100050201000519010005030100
+0500010105030102050301020503010205ff056b01000502010005020102050501000502
+010005000101050c07010300020204010301020204000001050b01000508010005050100
+050201000502010005180100050001000505010005020100050201000501010005020100
+051901000503010105010100050101000502010005010100050201000501010005020100
+05ff056a0100050201000501010005020100050401000502010105010100050b07010300
+020204010301020204000001050b01030505010005050100050201000502010005180100
+050001000505010005020100050201000501010005000100050001000519010005030100
+0509010005010100050501000502010005ff056a01040501010005020100050401000502
+010005020100050b07010300020204010301020204000001050b01000508010005050100
+050201040518010005000100050501000502010405010100050001000500010005190100
+0503010005060103050101000505010405ff056a01000502010005010104050401000502
+010005020100050b07010300020204010301020204000001050b01000508010005050100
+05020100051d010005060100050201000505010005000100050001000519010005030100
+0505010005020100050101000505010005ff056e01000502010005010100050801000502
+010005020100050b07010300020204010301020204000001050b01000508010005050100
+050201000502010005190100050601000502010005020100050101000500010005000100
+051901000503010005050100050201000501010005020100050101000502010005ff056a
+0100050201000501010005020100050401000502010105010100050b0701030002020401
+0301020204000001050b0100050801000505010005030102051a01000506010005030102
+0503010005000100051a01000503010005060103050201020503010205ff056b01000502
+010005020102050501000502010005000101050c07010300020204010301020204000001
+05ff05ff05100100050f07010300020204010301020204000001050a0106052a0106052a
+010605ff05840106050e0100050f07010300020204010301020204000001050a0106052a
+0106052a010605ff05840106050e0100050f0701030002020401030102020400000105ff
+05ff05210701030002020401030102020400000105ff05ff052107010300020204010301
+02020400000105ff05ff05210701030002020401030102020400000107ff07ff07230300
+02020401030102020400000007ff07ff072403000202040103010202040005ff05ff0525
+03000202040103010202040005ff05ff052503000202040103010202040005ff05ff0525
+03000202040103010202040005ff05ff052503000202040103010202040005ff05ff0525
+03000202040103010202040005ff05ff052503000202040103010202040005ff05ff0525
+03000202040103010202040005ff05ff052503000202040103010202040005ff05ff0525
+03000202040103010202040005ff05ff052503000202040103010202040005ff05ff0525
+03000202040103010202040005ff05ff052503000202040103010202040005ff05ff0525
+03000202040103010202040005ff05ff052503000202040103010202040005ff05ff0525
+03000202040103010202040005ff05ff052503000202040103010202040005ff05ff0515
+070f03000202040103010202040005ff05ff0515070f0300020204010301020204000504
+07ff07ff070e05010701060607000605030002020401030102020400050407ff07ff070d
+00000501070106050000070006050300020204010301020204000504070105ff05ff050a
+00010501070106050000070106040300020204010301020204000504070105cf010005ff
+053900010501070106040001070106040300020204010301020204000504070105030100
+050c01000504010005060100050a0102051801020503010205170100050d010205030102
+051f010205120100051501000502010205ff053300010501070106040001050007010603
+030002020401030102020400050407010517010005140100051a01000505010005170100
+050f010005050100052101000512010005140100050201000502010005ff053200010501
+070106030001050107010603030002020401030102020400050407010501010205020100
+050001010503010205020104050201020503010205050100050a01020503010205050100
+0505010005040101050a0102050201000500010105030102050501000505010005040101
+050301020502010005020100050201020505010005020100050201000502010205020104
+050201020502010005000101050501000506010005ff0532000105010701060300010502
+070106020300020204010301020204000504070105030100050201010501010005040100
+050401000506010005020100050201000504010005090100050201000501010005020100
+050401000505010005040101050901000502010005010101050101000501010005020100
+050401000505010005040101050201000502010005010100050201000501010005020100
+050401000502010005020100050101000502010005030100050301000502010005010101
+05010100050301000507010005ff05320001050107010602000105030701060203000202
+040103010202040005040701050301000502010005020100050401000504010005060100
+050601000504010005090100050901000504010005050100051001000505010005020100
+050101000502010005040100050501000509010005020100050101000502010005050100
+050401000502010005020100050501000503010005030100050201000501010005070100
+0505010105ff053300010501070106020001050407010601030002020401030102020400
+050407010503010005020100050201000504010005040100050601000503010305040100
+050901000506010305040100050501000511010205020100050201000501010405040100
+050501000509010405020100050001000503010305040100050201000502010005020103
+05030100050301000502010005010100050601000508010005ff05320001050107010601
+000105050701060103000202040103010202040005040701050301000502010005020100
+050401000504010005060100050201000502010005040100050901000505010005020100
+050401000505010005140100050101000502010005010100050801000505010005090100
+050601000500010005020100050201000504010005020100050201000501010005020100
+05030100050301000502010005010100050601000508010005ff05320001050107010601
+000105060701060003000202040103010202040005040701050301000502010005020100
+050401000504010005060100050201000502010005040100050901000502010005010100
+050201000504010005050100050401010509010005020100050101000502010005010100
+050201000504010005050100050401010502010005020100050301000503010005020100
+050401000502010005010101050101000502010005030100050301000502010005010100
+05050100050501000502010005ff05320001050107010600000105070701060003000202
+040103010202040005040701050301000502010005020100050401000505010105040100
+0503010305040100050a010205030103050401000505010005040101050a010205020100
+050201000502010205050100050501000504010105030102050401000504010305040100
+050301010500010005020103050401010502010205020100050501000506010205ff0533
+0001050107010600000105080701030002020401030102020400050407010530010505ff
+05d30001050107010001070b0300020204010301020204000504070105ff05ff050a0001
+050107010000070c0300020204010301020204000504070105ff05ff050a000105010701
+060d0300020204010301020204000504070105ff05ff050a000105010701000d03000202
+04010301020204000504070105ff05ff050a000105010701000d03000202040103010202
+04000504070105ff05ff050a0001050107010001050a0700030002020401030102020400
+0504070105ff05ff050a0001050107010001050a07000300020204010301020204000504
+070105ff05ff050a0001050107010001050a070003000202040103010202040005040701
+05ff05ff050a0001050107010001050a07000300020204010301020204000504070105ff
+05ff050a0001050107010001050a07000300020204010301020204000504070105ff05ff
+050a0001050107010001050a07000300020204010301020204000504070105ff05ff050a
+0001050107010001050a07000300020204010301020204000504070105ff05ff050a0001
+050107010001050a07000300020204010301020204000504070105ff05ff050a00010501
+07010001050a07000300020204010301020204000504070105ff05ff050a000105010701
+0001050a07000300020204010301020204000504070105ff05ff050a0001050107010001
+070b0300020204010301020204000504070105ff05ff050a0001050107010000070c0300
+020204010301020204000504070105ff05ff050a000105010701060d0300020204010301
+020204000504070105eb010005ff051d000105010701060d030002020401030102020400
+05040701052c0100050d0101051801000506010005250100050d010205030102051f0102
+050a0102051b01000502010205ff0517000105010701060d030002020401030102020400
+05040701052c0100050c0100051a0100052d0100050f01000505010005210100050c0100
+051a0100050201000502010005ff0516000105010701060d030002020401030102020400
+050407010501010205020100050201000501010005000101050201000500010105030102
+050201000500010105020104050a01000503010005020100050101000500010105030102
+050201040502010205030102050201000500010105040101050a01020502010005000101
+050301020505010005050100050401010503010205020100050201000502010205050100
+050c010005030102050301020502010005000101050501000506010005ff051600010501
+0701060d0300020204010301020204000504070105000100050201000501010005020100
+050101010501010005010101050101000501010005020100050101010501010005030100
+050a01040501010005020100050101010501010005010100050201000503010005060100
+050201000502010005010101050101000503010105090100050201000501010105010100
+050101000502010005040100050501000504010105020100050201000501010005020100
+050101000502010005040100050c01000502010005020100050101000502010005010101
+05010100050301000507010005ff0516000105010701060d030002020401030102020400
+050407010500010005050100050201000501010005050100050501000502010005010100
+0502010005030100050c0100050301000502010005010100050201000501010005070100
+0506010005020100050201000501010005020100050f0100050501000502010005010100
+050201000504010005050100050901000502010005010100050201000505010005040100
+050c01000502010005020100050101000502010005010100050201000503010005060100
+05ff0517000105010701060d030002020401030102020400050407010500010005050100
+05020100050101000505010005050104050101000502010005030100050c010005030100
+050201000501010005020100050101000507010005060100050201000502010005010100
+050201000510010205020100050201000501010405040100050501000509010405020100
+050001000503010305040100050c01000502010005020100050101000502010005010100
+05020100050201000506010005ff0518000105010701060d030002020401030102020400
+050407010500010005050100050201000501010005050100050501000505010005020100
+05030100050c010005030100050201000501010005020100050101000507010005060100
+050201000502010005010100050201000513010005010100050201000501010005080100
+05050100050901000506010005000100050201000502010005040100050c010005020100
+0502010005010100050201000501010005020100050201000505010005ff051900010501
+0701060d0300020204010301020204000504070105000100050201000501010005010101
+05010100050501000505010005020100050101000502010005030100050c010005030100
+050101010501010005020100050101000502010005030100050601000502010005020100
+050101000502010005030101050901000502010005010100050201000501010005020100
+050401000505010005040101050201000502010005030100050301000502010005040100
+050c01000502010005020100050101000502010005010101050101000501010005050100
+05ff051a000105010701060d030002020401030102020400050407010501010205030101
+05000100050101000505010005060102050201000502010005040101050a010005040101
+050001000501010005020100050201020505010105040100050301020502010005020100
+05030101050a010205020100050201000502010205050100050501000504010105030102
+050401000504010305040100050c01000503010205030102050201000500010105020100
+0505010405ff0516000105010701060d0300020204010301020204000504070105300105
+058c01050516010005ff0528000105010701060d03000202040103010202040005040701
+05e0010005ff0528000105010701060d0300020204010301020204000504070105e00100
+05ff0528000105010701060d0300020204010301020204000504070105ff05ff050a0001
+05010701060d0300020204010301020204000504070105ff05ff050a000105010701060d
+0300020204010301020204000504070105ff05ff050a000105010701060d030002020401
+0301020204000504070105ff05ff050a000105010701060d030002020401030102020400
+0504070105ff05ff050a000105010701060d0300020204010301020204000504070105ff
+05ff050a000105010701060d0300020204010301020204000504070105ff05ff050a0001
+05010701060d0300020204010301020204000504070105ff05ff050a000105010701060d
+0300020204010301020204000504070105ff05ff050a000105010701060d030002020401
+0301020204000504070105ff05ff050a000105010701060d030002020401030102020400
+0504070105ff05ff050a000105010701060d0300020204010301020204000504070105ff
+05ff050a000105010701060d0300020204010301020204000504070105ff05ff050a0001
+05010701060d0300020204010301020204000504070105ff05ff050a000105010701060d
+0300020204010301020204000504070105ff05ff050a000105010701060d030002020401
+0301020204000504070105ff05ff050a000105010701060d030002020401030102020400
+0504070105000100052b0100051f01020503010205ff05b1000105010701060d03000202
+04010301020204000504070105000100054b010005020100050101000502010005ff05b0
+000105010701060d03000202040103010202040005040701050001000500010105030102
+050301020502010005000101050a01020503010205020104050201020504010105090100
+05020100050101000502010005ff05b0000105010701060d030002020401030102020400
+050407010500010105010100050101000502010005010100050201000501010105010100
+050801000502010005040100050601000501010005020100050301010509010005020100
+050101000502010005ff05b0000105010701060d03000202040103010202040005040701
+050001000502010005010100050201000505010005010100050201000508010005080100
+050501000502010005020100051001020503010305ff05b0000105010701060d03000202
+040103010202040005040701050001000502010005010104050201030501010005020100
+05090102050501000504010005030104050f0100050201000505010005ff05b000010501
+0701060d0300020204010301020204000504070105000100050201000501010005050100
+050201000501010005020100050c01000504010005030100050401000513010005020100
+0505010005ff05b0000105010701060d0300020204010301020204000504070105000100
+050201000501010005020100050101000502010005010101050101000508010005020100
+050401000502010005050100050201000503010105090100050201000501010005020100
+05ff05b0000105010701060d030002020401030102020400050407010500010005020100
+05020102050301030501010005000101050a010205050100050201040502010205040101
+050a01020503010205ff05b1000105010701060d03000202040103010202040005040701
+051501000504010505ff05e8000105010701060d03000202040103010202040005040701
+0515010005ff05f3000105010701060d0300020204010301020204000504070105150100
+05ff05f3000105010701060d0300020204010301020204000504070105ff05ff050a0001
+05010701060d0300020204010301020204000504070105ff05ff050a000105010701060d
+0300020204010301020204000504070105ff05ff050a000105010701060d030002020401
+0301020204000504070105ff05ff050a000105010701060d030002020401030102020400
+0504070105ff05ff050a000105010701060d0300020204010301020204000504070105ff
+05ff050a000105010701060d0300020204010301020204000504070105ff05ff050a0001
+05010701060d0300020204010301020204000504070105ff05ff050a000105010701060d
+0300020204010301020204000504070105ff05ff050a000105010701060d030002020401
+0301020204000504070105ff05ff050a000105010701060d030002020401030102020400
+0504070105ff05ff050a000105010701060d0300020204010301020204000504070105ff
+05ff050a000105010701060d0300020204010301020204000504070105ff05ff050a0001
+05010701060d0300020204010301020204000504070105ff05ff050a000105010701060d
+0300020204010301020204000504070105ff05ff050a000105010701060d030002020401
+0301020204000504070105ff05ff050a000105010701060d030002020401030102020400
+05040701050901000511010005160100051e01040502010205ff05aa000105010701060d
+030002020401030102020400050407010509010005110100053601000505010005020100
+05ff05a9000105010701060d030002020401030102020400050407010501010205020104
+05020102050301020502010005010100050a010205030102050201040502010205040101
+050901000509010005ff05a9000105010701060d03000202040103010202040005040701
+050001000502010005030100050301000502010005010100050201000501010005000100
+050a01000502010005040100050601000501010005020100050301010509010305060100
+05ff05a9000105010701060d030002020401030102020400050407010500010005070100
+050701000501010005050101050b01000508010005050100050201000502010005130100
+0503010105ff05aa000105010701060d0300020204010301020204000504070105010102
+05040100050401030501010005050101050c010205050100050401000503010405130100
+0505010005ff05a9000105010701060d0300020204010301020204000504070105040100
+050301000503010005020100050101000505010005000100050e01000504010005030100
+0504010005130100050201000505010005ff05a9000105010701060d0300020204010301
+020204000504070105000100050201000503010005030100050201000501010005020100
+050101000501010005090100050201000504010005020100050501000502010005030101
+0509010005020100050101000502010005ff05a9000105010701060d0300020204010301
+020204000504070105010102050501010502010305020102050201000502010005090102
+05050100050201040502010205040101050a01020503010205ff05aa000105010701060d
+030002020401030102020400050407010522010505ff05e1000105010701060d03000202
+04010301020204000504070105ff05ff050a000105010701060d03000202040103010202
+04000504070105ff05ff050a000105010701060d03000202040103010202040005040701
+05ff05ff050a000105010701060d0300020204010301020204000504070105ff05ff050a
+000105010701060d0300020204010301020204000504070105ff05ff050a000105010701
+060d0300020204010301020204000504070105ff05ff050a000105010701060d03000202
+04010301020204000504070105ff05ff050a000105010701060d03000202040103010202
+04000504070105ff05ff050a000105010701060d03000202040103010202040005040701
+05ff05ff050a000105010701060d0300020204010301020204000504070105ff05ff050a
+000105010701060d0300020204010301020204000504070105ff05ff050a000105010701
+060d0300020204010301020204000504070105ff05ff050a000105010701060d03000202
+04010301020204000504070105ff05ff050a000105010701060d03000202040103010202
+04000504070105ff05ff050a000105010701060d03000202040103010202040005040701
+05ff05ff050a000105010701060d0300020204010301020204000504070105ff05ff050a
+000105010701060d0300020204010301020204000504070105ff05ff050a000105010701
+060d0300020204010301020204000504070105ff05ff050a000105010701060d03000202
+040103010202040005040701051201000511010005060100052601020503010205ff05aa
+000105010701060d030002020401030102020400050407010512010005110100052d0100
+05020100050101000502010005ff05a9000105010701060d030002020401030102020400
+050407010500010005000101050301020503010105000100050101000502010005020102
+05020104050201020503010205020100050001010503010205040101050d010005010100
+05ff05ad000105010701060d030002020401030102020400050407010500010105010100
+050101000502010005010100050101010501010005020100050101000502010005030100
+0506010005020100050201000501010105010100050101000502010005030101050d0100
+0501010005ff05ad000105010701060d0300020204010301020204000504070105000100
+050501000502010005010100050201000501010005020100050101000507010005060100
+0502010005020100050101000502010005010100051601000502010305ff05aa00010501
+0701060d0300020204010301020204000504070105000100050501040501010005020100
+050101000502010005010100050701000506010005020100050201000501010005020100
+0502010205120100050301000502010005ff05a9000105010701060d0300020204010301
+020204000504070105000100050501000505010005020100050101000502010005010100
+050701000506010005020100050201000501010005020100050501000510010005040100
+0502010005ff05a9000105010701060d0300020204010301020204000504070105000100
+050501000502010005010100050101010501010005010101050101000502010005030100
+050601000502010005020100050101000502010005010100050201000503010105090100
+050501000502010005ff05a9000105010701060d03000202040103010202040005040701
+050001000506010205030101050001000502010105000100050201020505010105040100
+0503010205020100050201000502010205040101050901040502010205ff05aa00010501
+0701060d0300020204010301020204000504070105ff05ff050a000105010701060d0300
+020204010301020204000504070105ff05ff050a000105010701060d0300020204010301
+020204000504070105ff05ff050a000105010701060d0300020204010301020204000504
+070105ff05ff050a000105010701060d0300020204010301020204000504070105ff05ff
+050a000105010701060d0300020204010301020204000504070105ff05ff050a00010501
+0701060d0300020204010301020204000504070105ff05ff050a000105010701060d0300
+020204010301020204000504070105ff05ff050a000105010701060d0300020204010301
+020204000504070105ff05ff050a000105010701060d0300020204010301020204000504
+070105ff05ff050a000105010701060d0300020204010301020204000504070105ff05ff
+050a000105010701060d0300020204010301020204000504070105ff05ff050a00010501
+0701060d0300020204010301020204000504070105ff05ff050a000105010701060d0300
+020204010301020204000504070105ff05ff050a000105010701060d0300020204010301
+020204000504070105ff05ff050a000105010701060d0300020204010301020204000504
+070105ff05ff050a000105010701060d0300020204010301020204000504070105ff05ff
+050a000105010701060d0300020204010301020204000504070105ff05ff050a00010501
+0701060d030002020401030102020400050407010532010305ff05d3000105010701060d
+03000202040103010202040005040701050101020505010005090100051b010005ff05d6
+000105010701060d030002020401030102020400050407010503010005100100051b0100
+05ff05d6000105010701060d030002020401030102020400050407010503010005030102
+050201000500010105020100050101000503010205040101050a010005ff05d600010501
+0701060d0300020204010301020204000504070105030100050501000502010105010100
+0501010005000100050301000502010005030101050a010005ff05d6000105010701060d
+030002020401030102020400050407010503010005050100050201000502010005010101
+050401000514010005ff05d6000105010701060d03000202040103010202040005040701
+0503010005050100050201000502010005010101050501020511010005ff05d600010501
+0701060d0300020204010301020204000504070105030100050501000502010005020100
+0501010005000100050701000510010005ff05d6000105010701060d0300020204010301
+020204000504070105030100050501000502010005020100050101000501010005020100
+0502010005030101050a010005ff05d6000105010701060d030002020401030102020400
+050407010503010005050100050201000502010005010100050201000502010205040101
+050a010005ff05d6000105010701060d0300020204010301020204000504070105320103
+05ff05d3000105010701060d0300020204010301020204000504070105ff05ff050a0001
+05010701060d0300020204010301020204000504070105ff05ff050a000105010701060d
+0300020204010301020204000504070105ff05ff050a000105010701060d030002020401
+0301020204000504070105120100052a01000506010305ff05bf000105010701060d0300
+02020401030102020400050407010511010005040101050a010205030102050b01010502
+01000508010005ff05bf000105010701060d030002020401030102020400050407010510
+010005040100050101000508010005020100050101000502010005090100050101000502
+01000507010005ff05bf000105010701060d03000202040103010202040005040701050f
+01000505010005010100050c0100050501000509010005010100050301000506010005ff
+05bf000105010701060d03000202040103010202040005040701050e0100050601000501
+0100050c0100050501000509010005010100050401000505010005ff05bf000105010701
+060d03000202040103010202040005040701050d01000507010005010100050b01000504
+0101050a010005010100050501000504010005ff05bf000105010701060d030002020401
+03010202040005040701050e01000506010005010100050a010005070100050901000501
+0100050401000505010005ff05bf000105010701060d0300020204010301020204000504
+0701050f0100050501000501010005090100050801000509010005010100050301000506
+010005ff05bf000105010701060d03000202040103010202040005040701051001000504
+010005010100050301010502010005050100050201000503010105030100050101000502
+01000507010005ff05bf000105010701060d030002020401030102020400050407010511
+0100050401010504010105020104050201020504010105040101050201000508010005ff
+05bf000105010701060d0300020204010301020204000504070105120100052a01000506
+010305ff05bf000105010701060d0300020204010301020204000504070105ff05ff050a
+000105010701060d0300020204010301020204000504070105ff05ff050a000105010701
+060d0300020204010301020204000504070105ff05ff050a000105010701060d03000202
+04010301020204000504070105ff05ff050a000105010701060d03000202040103010202
+04000504070105ff05ff050a000105010701060d03000202040103010202040005040701
+05ff05ff050a000105010701060d0300020204010301020204000504070105ff05ff050a
+000105010701060d0300020204010301020204000504070105ff05ff050a000105010701
+060d0300020204010301020204000504070105ff05ff050a000105010701060d03000202
+04010301020204000504070105ff05ff050a000105010701060d03000202040103010202
+04000504070105ff05ff050a000105010701060d03000202040103010202040005040701
+05ff05ff050a000105010701060d0300020204010301020204000504070105ff05ff050a
+000105010701060d0300020204010301020204000504070105ff05ff050a000105010701
+060d0300020204010301020204000504070105ff05ff050a000105010701060d03000202
+04010301020204000504070105ff05ff050a000105010701060d03000202040103010202
+04000504070105ff05ff050a000105010701060d03000202040103010202040005040701
+05ff05ff050a000105010701060d03000202040103010202040005040701050201000530
+010005040100051401010509010205ff05aa000105010701060d03000202040103010202
+040005040701050201000536010005130100050d010005ff05aa000105010701060d0300
+020204010301020204000504070105000104050101000500010105030102050201000500
+0101050a01020502010005020100050201020502010405030101050b0100050401020505
+0100050301020503010205ff059c000105010701060d0300020204010301020204000504
+070105020100050301010501010005010100050201000501010105010100050801000502
+010005010100050201000504010005040100050501010509010405010100050201000504
+01000502010005020100050101000502010005ff059b000105010701060d030002020401
+030102020400050407010502010005030100050901000501010005020100050801000502
+010005020100050001000505010005040100051301000507010005040100050201000505
+01000502010005ff059b000105010701060d030002020401030102020400050407010502
+010005030100050601030501010005020100050801040503010005060100050401000513
+01000504010305040100050301020502010405ff059b000105010701060d030002020401
+030102020400050407010502010005030100050501000502010005010100050201000508
+010005060100050001000505010005040100051301000503010005020100050401000506
+01000501010005ff059f000105010701060d030002020401030102020400050407010502
+010005030100050501000502010005010101050101000508010005020100050101000502
+0100050401000504010005050101050b0100050301000502010005040100050201000502
+0100050101000502010005ff059b000105010701060d0300020204010301020204000504
+07010503010105010100050601030501010005000101050a010205020100050201000504
+01000505010105030101050b01000504010305040100050301020503010205ff059c0001
+05010701060d03000202040103010202040005040701051501000504010505ff05e80001
+05010701060d030002020401030102020400050407010515010005ff05f3000105010701
+060d030002020401030102020400050407010515010005ff05f3000105010701060d0300
+020204010301020204000504070105ff05ff050a000105010701060d0300020204010301
+020204000504070105ff05ff050a000105010701060d0300020204010301020204000504
+070105ff05ff050a000105010701060d0300020204010301020204000504070105ff05ff
+050a000105010701060d0300020204010301020204000504070105ff05ff050a00010501
+0701060d0300020204010301020204000504070105ff05ff050a000105010701060d0300
+020204010301020204000504070105ff05ff050a000105010701060d0300020204010301
+020204000504070105ff05ff050a000105010701060d0300020204010301020204000504
+070105ff05ff050a000105010701060d0300020204010301020204000504070105ff05ff
+050a000105010701060d0300020204010301020204000504070105ff05ff050a00010501
+0701060d0300020204010301020204000504070105ff05ff050a000105010701060d0300
+020204010301020204000504070105ff05ff050a000105010701060d0300020204010301
+020204000504070105ff05ff050a000105010701060d0300020204010301020204000504
+0701057301010597010105350101053501010540010105190101050b0101050401010516
+000105010701060d0300020204010301020204000504070105040100052a010005400100
+05540100052a010005160100052e0103050301000536010005440100050b010305010103
+050401000503010305040100050501000515000105010701060d03000202040103010202
+0400050407010503010005040101050a010205030102050b010105020100053f0100050a
+0100050d010205030102051b01000512010005040101050a010205030102050b01010502
+0100051501000519010205110100050601000512010205030102050b0100050c0100050c
+0100051a0100050b0102050b0100050b0100050701000504010005060100050401000505
+01000515000105010701060d030002020401030102020400050407010502010005040100
+0501010005080100050201000501010005020100050901000501010005020100053e0100
+050a0100050f010005050100051b01000511010005040100050101000508010005020100
+050101000502010005090100050101000502010005140100051b01000511010005060100
+0514010005050100050a0101050c0100050c010005190101050d0100050b0100050b0100
+05070100050401000506010005040100050501000515000105010701060d030002020401
+03010202040005040701050101000505010005010100050c010005050100050901000501
+010005030100050501010509010005000101050301020503010205190100050401020502
+010005000101050301020505010005050100050a01020502010105000100050301010500
+0100051001000505010005010100050c0100050501000509010005010100050301000513
+010005040102050201000502010005020102050501000511010005060100050401020503
+010205050100050501000509010005000100050c01000504010205020104050201020502
+0101050001000509010005000100050d01000503010205040100050b0100050701000504
+01000506010005040100050501000515000105010701060d030002020401030102020400
+05040701050001000506010005010100050c010005050100050901000501010005040100
+050401010509010105010100050101000502010005010100050201000518010005030100
+050201000501010105010100050101000502010005040100050501000509010005020100
+0501010005000100050001000501010005010101050f01000506010005010100050c0100
+050501000509010005010100050401000512010005030100050201000501010005020100
+050101000502010005040100051101000506010005030100050201000501010005020100
+0504010005050100050b0100050c01000503010005020100050301000503010005020100
+050101000500010005000100050a0100050d0100050201000502010005030100050b0100
+05070100050401000506010005040100050501000515000105010701060d030002020401
+0301020204000504070101000507010005010100050a010105050100050a010005010100
+05050100050f0100050501000502010005010100051a0101050401000505010005020100
+050101000502010005040100050501000509010005050100050001000500010005010100
+05020100050e01000507010005010100050b010005040101050a01000501010005050100
+050f01010504010005020100050101000502010005050100050401000511010005040101
+05040100050901000504010005050100050b0100050a0101050801000503010005030100
+05020100050101000500010005000100050a0100050d0100050201000508010105090100
+05070100050501010504010005050101050401010513000105010701060d030002020401
+03010202040005040701050001000506010005010100050c010005030100050b01000501
+010005040100051001000505010405010100051c01000504010205020100050201000501
+01040504010005050100050901000505010005000100050001000501010005020100050f
+01000506010005010100050a010005070100050901000501010005040100051201000503
+010405020100050001000503010305040100051101000506010005030100050601030504
+010005050100050b0100050c010005040103050301000503010005020100050101000500
+010005000100050a0100050d01000503010205040100050b010005070100050401000506
+010005040100050501000515000105010701060d03000202040103010202040005040701
+050101000505010005010100050c010005020100050c0100050101000503010005110100
+0505010005050100051c0100050701000501010005020100050101000508010005050100
+050901000505010005000100050001000501010005020100051001000505010005010100
+050901000508010005090100050101000503010005130100050301000506010005000100
+050201000502010005040100051101000506010005030100050501000502010005040100
+05050100050b0100050c0100050301000502010005030100050301000502010005010100
+0500010005000100050a0100050d01000506010005030100050b01000507010005040100
+0506010005040100050501000515000105010701060d0300020204010301020204000504
+070105020100050401000501010005030101050201000502010005010100050701010503
+010005010100050201000506010105090100050501000502010005010100050201000518
+010005030100050201000501010005020100050101000502010005040100050501000509
+010005020100050101000500010005000100050101000501010105030101050b01000504
+010005010100050301010502010005050100050201000503010105030100050101000502
+010005060101050b01000503010005020100050301000503010005020100050401000504
+0101050a0100050601000503010005020100050101000502010005040100050501000504
+010105040100050501010504010005030100050201000503010005030100050201000501
+010005000100050001000503010105040100050501010505010005020100050201000503
+010005050101050301000507010005040100050601000504010005050100051500010501
+0701060d0300020204010301020204000504070105030100050401010504010105030102
+050201040503010105040101050201000507010105090100050601020503010205190100
+050401020502010005020100050201020505010005050100050a01020502010005000100
+05000100050201010500010005030101050c010005040101050401010502010405020102
+05040101050401010502010005070101050b010005040102050401000504010305040100
+05040101050a010005060100050401020503010305040100050501000504010105020104
+050301010504010005040103050401010502010205020100050001000500010005030101
+050201040503010105050100050301020504010005050101050301000507010005040100
+0506010005040100050501000515000105010701060d0300020204010301020204000504
+070105040100052a0100054001000525010505190100050d0100052a010005090100050b
+010005220100050a01030503010005220100050c01000504010005220100050c01000512
+010005060100050301030501010305040100050301030504010005050100051500010501
+0701060d03000202040103010202040005040701057301010541010105430101050d0101
+051e010105140101051e0101050b010105060101051e0101050b01010511010105050101
+05110101050b0101050401010516000105010701060d0300020204010301020204000504
+070105ff05ff050a000105010701060d0300020204010301020204000504070105ff0506
+0101055f010105630101051501010521000105010701060d030002020401030102020400
+0504070105040100052a0100051d010005b401000506010005040100053e010005120100
+05070100052a0100051501000501010005180100051301000523000105010701060d0300
+02020401030102020400050407010503010005040101050a010205030102050b01010502
+0100051c0100051f010405280100053f010005030100051f01000506010005030102052d
+01020503010205050100051201000506010005040101050a010205030102050b01010502
+0100051401000501010005010103050c010105030100051301000523000105010701060d
+030002020401030102020400050407010502010005040100050101000508010005020100
+0501010005020100050901000501010005020100051b010005210100052a0100053f0100
+05030100051f010005050100050301000500010005000100052e01000505010005040100
+051301000505010005040100050101000508010005020100050101000502010005090100
+050101000502010005130100050101000501010005020100050a01000505010005130100
+0523000105010701060d0300020204010301020204000504070105010100050501000501
+0100050c0100050501000509010005010100050301000505010105120100052101000504
+010205040101050a010205030102050301010500010005020102050a0102050301020502
+010005000101050201000502010005020102050201000500010105080101050101010502
+0102050301010500010005030101050b0100050401000504010005000100050401010500
+0100050201020502010005000101050a0102050301020505010005050100050301000514
+0100050401000505010005010100050c0100050501000509010005010100050301000511
+010505000100050201000502010205040100050501000513010005040102050201000500
+01010503010205020100050201000501010005000101000105010701060d030002020401
+03010202040005040701050001000506010005010100050c010005050100050901000501
+010005040100050401010512010005210100050301000502010005030101050901000502
+010005010100050201000501010005010101050101000502010005080100050201000501
+010005020100050101010501010005010100050201000501010005020100050101010501
+010005070101050101010501010005020100050101000501010105030101050b0100050a
+010005000100050301000501010105010100050201000501010105010100050801000502
+01000501010005020100050401000505010005190100050301000506010005010100050c
+010005050100050901000501010005040100051101000501010005010100050201000501
+010005020100050101040503010005130100050301000502010005010101050101000501
+0100050201000501010005020100050101010501000105010701060d0300020204010301
+020204000504070101000507010005010100050a010105050100050a0100050101000505
+010005180100052101000503010005020100050f01000505010005020100050101000502
+010005010100050201000508010005050100050201000501010005050100050201000501
+01000502010005010100050b01000500010105000100050101000505010005020100050f
+0101050c0102050201000502010005010100050201000501010005020100050801000509
+0100050401000505010005170101050301000507010005010100050a010105050100050a
+01000501010005050100050f010005010100050201030502010005020100050301000506
+0101050f0101050401000502010005010100050201000501010005050100050201000501
+01000502000105010701060d030002020401030102020400050407010500010005060100
+05010100050c010005030100050b01000501010005040100051901000521010005030100
+05020100050f010005050100050201000501010005020100050101040509010205020104
+0501010005060100050001000502010405010100050b0100050001010500010005020102
+050201000502010005110100050c01000500010005010100050201000501010405010100
+050201000508010005060103050401000505010005190100050301000506010005010100
+050c010005030100050b01000501010005040100050f0105050101000501010005020104
+050301000505010005130100050301040501010005020100050201020502010005020100
+050101000502000105010701060d03000202040103010202040005040701050101000505
+010005010100050c010005020100050c01000501010005030100053d0100050301000502
+0100050f0100050501000502010005010100050201000501010005100100050101000505
+010005060100050001000502010005050100050b01000503010005050100050101000502
+010005110100050c01000500010005010100050201000501010005050100050201000508
+01000505010005020100050401000505010005190100050401000505010005010100050c
+010005020100050c01000501010005030100051101000501010005020100050201000501
+010005070100050501000513010005030100050501000502010005050100050101000502
+0100050101000502000105010701060d0300020204010301020204000504070105020100
+050401000501010005030101050201000502010005010100050701010503010005010100
+050201000506010105350100050301000502010005030101050901000502010005010100
+050201000501010005010101050101000502010005080100050201000501010005020100
+0501010005070100050301000502010005010100050b0100050301000501010005020100
+050101000501010105030101050b0100050a010005000100050001000501010005010101
+050101000502010005010100050201000508010005020100050101000502010005040100
+05050100050b0101050b0100050501000504010005010100050301010502010005020100
+050101000507010105030100050101000502010005060101050901000501010005020100
+050201000501010005020100050301000505010005050101050b01000503010005020100
+050101000502010005010100050201000501010005010101050101000502000105010701
+060d03000202040103010202040005040701050301000504010105040101050301020502
+01040503010105040101050201000507010105120100052101000504010205040101050a
+010205030102050301010500010005020102050a01020503010205020100050701000504
+010205020100050b01000503010005020102050301010500010005030101050b0100050b
+010205030101050001000502010205020100050201000509010205030103050401000505
+0100050b0101050b01000506010005040101050401010503010205020104050301010504
+010105020100050701010509010005010100050201000502010005020102050401000505
+010005050101050b01000504010205020100050201000502010205030101050001000501
+01000502000105010701060d0300020204010301020204000504070105040100052a0100
+057501050544010005110100050c010005070100050e010505270100050b010005070100
+052a0100050901000527010005060100050b01000523000105010701060d030002020401
+0301020204000504070105ee01000502010005120101050f010005020100053a0101050d
+0101053a01010526010105050101050d01010521000105010701060d0300020204010301
+020204000504070105ef01020526010205ed000105010701060d03000202040103010202
+04000504070105730101052e0101058d01010504010105cc000105010701060d03000202
+04010301020204000504070105040100052a010005400100050401000501010005260100
+059101000505010005cb000105010701060d030002020401030102020400050407010503
+010005040101050a010205030102050b010105020100053f010005040100050101000501
+0103050c010105110100051501000509010205260102050c0100050b0100052001020504
+01000505010005cb000105010701060d0300020204010301020204000504070105020100
+050401000501010005080100050201000501010005020100050901000501010005020100
+053e010005040100050101000501010005020100050a01000513010005150100050b0100
+052801000519010005220100050401000505010005cb000105010701060d030002020401
+03010202040005040701050101000505010005010100050c010005050100050901000501
+010005030100050501010509010005000101050301020503010205190100050301050500
+010005020100050201020504010005130100050301010500010005030102050301010500
+01000501010005020100050401000503010205110102050201000500010105050100050a
+010205020100050001010502010405020102050201000500010105020100050001010503
+010205050100050401000505010005cb000105010701060d030002020401030102020400
+05040701050001000506010005010100050c010005050100050901000501010005040100
+050401010509010105010100050101000502010005010100050201000518010005040100
+050101000501010005020100050101000502010005010104051101000503010005000100
+050001000501010005020100050101000501010105010100050201000504010005020100
+05020100050f010005020100050101010501010005040100050c01000502010105010100
+050301000503010005020100050101010501010005010101050101000501010005020100
+05040100050401000505010005cb000105010701060d0300020204010301020204000504
+070101000507010005010100050a010105050100050a01000501010005050100050f0100
+050501000502010005010100051a01010504010005010100050201030502010005020100
+050301000511010105040100050001000500010005010100050201000501010005020100
+0501010005020100050401000502010005020100050f0100050201000501010005080100
+050c01000502010005020100050301000503010005020100050101000505010005020100
+0505010005040100050501010504010105c9000105010701060d03000202040103010202
+040005040701050001000506010005010100050c010005030100050b0100050101000504
+0100051001000505010405010100051c0100050201050501010005010100050201040503
+010005130100050301000500010005000100050101000502010005010100050201000501
+0100050201000504010005020104050f01040501010005080100050c0100050201000502
+010005030100050301040501010005050100050201000502010305040100050401000505
+010005cb000105010701060d030002020401030102020400050407010501010005050100
+05010100050c010005020100050c01000501010005030100051101000505010005050100
+051c01000503010005010100050201000502010005010100050701000513010005030100
+050001000500010005010100050201000501010005020100050101000502010005040100
+05020100051301000505010005080100050c010005020100050201000503010005030100
+050501000505010005020100050101000502010005040100050401000505010005cb0001
+05010701060d030002020401030102020400050407010502010005040100050101000503
+010105020100050201000501010005070101050301000501010005020100050601010509
+010005050100050201000501010005020100051801000503010005010100050201000502
+010005010100050201000503010005050101050b01000503010005000100050001000501
+010005020100050101000501010105010100050101010504010005020100050201000503
+010105090100050201000501010005080100050c01000502010005020100050301000503
+010005020100050101000505010005020100050101000502010005040100050401000505
+010005cb000105010701060d030002020401030102020400050407010503010005040101
+050401010503010205020104050301010504010105020100050701010509010005060102
+050301020519010005030100050101000502010005020100050201020504010005050101
+050b01000503010005000100050001000502010205030101050001000502010105000100
+050401000503010205040101050a01020502010005080100050c01000502010005020100
+050401010502010205020100050501000502010005020103050401000504010005050100
+05cb000105010701060d0300020204010301020204000504070105040100052a01000540
+010005220100050b010005300100051d0105053b01000505010005cb000105010701060d
+0300020204010301020204000504070105730101051e0101050d0101052c0101055e0101
+0504010105cc000105010701060d0300020204010301020204000504070105ff05ff050a
+000105010701060d0300020204010301020204000504070105ff05060101055f01010563
+0101051501010521000105010701060d0300020204010301020204000504070105040100
+052a0100051d010005b401000506010005040100053e01000512010005070100052a0100
+051501000501010005180100051301000523000105010701060d03000202040103010202
+0400050407010503010005040101050a010205030102050b010105020100051c0100051f
+010405280100053f010005030100051f01000506010005030102052d0102050301020505
+0100051201000506010005040101050a010205030102050b010105020100051401000501
+010005010103050c010105030100051301000523000105010701060d0300020204010301
+020204000504070105020100050401000501010005080100050201000501010005020100
+050901000501010005020100051b010005210100052a0100053f010005030100051f0100
+05050100050301000500010005000100052e010005050100050401000513010005050100
+050401000501010005080100050201000501010005020100050901000501010005020100
+05130100050101000501010005020100050a010005050100051301000523000105010701
+060d03000202040103010202040005040701050101000505010005010100050c01000505
+01000509010005010100050301000505010105120100052101000504010205040101050a
+010205030102050301010500010005020102050a01020503010205020100050001010502
+010005020100050201020502010005000101050801010501010105020102050301010500
+010005030101050b01000504010005040100050001000504010105000100050201020502
+010005000101050a01020503010205050100050501000503010005140100050401000505
+010005010100050c01000505010005090100050101000503010005110105050001000502
+010005020102050401000505010005130100050401020502010005000101050301020502
+0100050201000501010005000101000105010701060d0300020204010301020204000504
+0701050001000506010005010100050c0100050501000509010005010100050401000504
+010105120100052101000503010005020100050301010509010005020100050101000502
+010005010100050101010501010005020100050801000502010005010100050201000501
+010105010100050101000502010005010100050201000501010105010100050701010501
+01010501010005020100050101000501010105030101050b0100050a0100050001000503
+010005010101050101000502010005010101050101000508010005020100050101000502
+0100050401000505010005190100050301000506010005010100050c0100050501000509
+010005010100050401000511010005010100050101000502010005010100050201000501
+010405030100051301000503010005020100050101010501010005010100050201000501
+010005020100050101010501000105010701060d03000202040103010202040005040701
+01000507010005010100050a010105050100050a01000501010005050100051801000521
+01000503010005020100050f010005050100050201000501010005020100050101000502
+010005080100050501000502010005010100050501000502010005010100050201000501
+0100050b01000500010105000100050101000505010005020100050f0101050c01020502
+010005020100050101000502010005010100050201000508010005090100050401000505
+010005170101050301000507010005010100050a010105050100050a0100050101000505
+0100050f0100050101000502010305020100050201000503010005060101050f01010504
+010005020100050101000502010005010100050501000502010005010100050200010501
+0701060d03000202040103010202040005040701050001000506010005010100050c0100
+05030100050b0100050101000504010005190100052101000503010005020100050f0100
+050501000502010005010100050201000501010405090102050201040501010005060100
+050001000502010405010100050b01000500010105000100050201020502010005020100
+05110100050c010005000100050101000502010005010104050101000502010005080100
+05060103050401000505010005190100050301000506010005010100050c010005030100
+050b01000501010005040100050f01050501010005010100050201040503010005050100
+051301000503010405010100050201000502010205020100050201000501010005020001
+05010701060d03000202040103010202040005040701050101000505010005010100050c
+010005020100050c01000501010005030100053d01000503010005020100050f01000505
+010005020100050101000502010005010100051001000501010005050100050601000500
+01000502010005050100050b01000503010005050100050101000502010005110100050c
+010005000100050101000502010005010100050501000502010005080100050501000502
+0100050401000505010005190100050401000505010005010100050c010005020100050c
+010005010100050301000511010005010100050201000502010005010100050701000505
+010005130100050301000505010005020100050501000501010005020100050101000502
+000105010701060d03000202040103010202040005040701050201000504010005010100
+050301010502010005020100050101000507010105030100050101000502010005060101
+053501000503010005020100050301010509010005020100050101000502010005010100
+050101010501010005020100050801000502010005010100050201000501010005070100
+050301000502010005010100050b01000503010005010100050201000501010005010101
+05030101050b0100050a0100050001000500010005010100050101010501010005020100
+0501010005020100050801000502010005010100050201000504010005050100050b0101
+050b01000505010005040100050101000503010105020100050201000501010005070101
+050301000501010005020100050601010509010005010100050201000502010005010100
+05020100050301000505010005050101050b010005030100050201000501010005020100
+05010100050201000501010005010101050101000502000105010701060d030002020401
+030102020400050407010503010005040101050401010503010205020104050301010504
+0101050201000507010105120100052101000504010205040101050a0102050301020503
+01010500010005020102050a01020503010205020100050701000504010205020100050b
+01000503010005020102050301010500010005030101050b0100050b0102050301010500
+010005020102050201000502010005090102050301030504010005050100050b0101050b
+010005060100050401010504010105030102050201040503010105040101050201000507
+01010509010005010100050201000502010005020102050401000505010005050101050b
+010005040102050201000502010005020102050301010500010005010100050200010501
+0701060d0300020204010301020204000504070105040100052a01000575010505440100
+05110100050c010005070100050e010505270100050b010005070100052a010005090100
+0527010005060100050b01000523000105010701060d0300020204010301020204000504
+070105ee01000502010005120101050f010005020100053a0101050d0101053a01010526
+010105050101050d01010521000105010701060d03000202040103010202040005040701
+05ef01020526010205ed000105010701060d030002020401030102020400050407010573
+0101052e0101059401010504010105c5000105010701060d030002020401030102020400
+0504070105040100052a0100054001000504010005010100052601000598010005050100
+05c4000105010701060d030002020401030102020400050407010503010005040101050a
+010205030102050b010105020100053f0100050401000501010005010103050c01010511
+01000515010005090102051e0100050d010205030102050d0100050b0101051001020504
+0100050501000505010005c4000105010701060d03000202040103010202040005040701
+050201000504010005010100050801000502010005010100050201000509010005010100
+05020100053e010005040100050101000501010005020100050a01000513010005150100
+050b0100051e0100050f010005050100050d0100050a0100051401000504010005050100
+0505010005c4000105010701060d03000202040103010202040005040701050101000505
+010005010100050c01000505010005090100050101000503010005050101050901000500
+010105030102050301020519010005030105050001000502010005020102050401000513
+010005030101050001000503010205030101050001000501010005020100050401000503
+0102051101020502010005000101050301020505010005050100050a0101050001000502
+0102050401000504010205020100050201000504010005020104050301000505010005c4
+000105010701060d03000202040103010202040005040701050001000506010005010100
+050c01000505010005090100050101000504010005040101050901010501010005010100
+050201000501010005020100051801000504010005010100050101000502010005010100
+050201000501010405110100050301000500010005000100050101000502010005010100
+050101010501010005020100050401000502010005020100050f01000502010005010101
+050101000501010005020100050401000505010005090100050101010501010005020100
+050101040501010005020100050101000502010005040100050401000505010005050100
+05c4000105010701060d0300020204010301020204000504070101000507010005010100
+050a010105050100050a01000501010005050100050f0100050501000502010005010100
+051a01010504010005010100050201030502010005020100050301000511010105040100
+050001000500010005010100050201000501010005020100050101000502010005040100
+0502010005020100050f0100050501000502010005010100050201000504010005050100
+050901000502010005010100050201000503010005070100050101000502010005040100
+05040100050601010504010105c2000105010701060d0300020204010301020204000504
+0701050001000506010005010100050c010005030100050b010005010100050401000510
+01000505010405010100051c010005020105050101000501010005020104050301000513
+010005030100050001000500010005010100050201000501010005020100050101000502
+010005040100050201040510010205020100050201000501010405040100050501000509
+010005020100050101040503010005040103050101000502010005040100050401000505
+01000505010005c4000105010701060d0300020204010301020204000504070105010100
+0505010005010100050c010005020100050c010005010100050301000511010005050100
+05050100051c010005030100050101000502010005020100050101000507010005130100
+050301000500010005000100050101000502010005010100050201000501010005020100
+050401000502010005170100050101000502010005010100050801000505010005090100
+050201000501010005070100050301000502010005010100050201000504010005040100
+050501000505010005c4000105010701060d030002020401030102020400050407010502
+010005040100050101000503010105020100050201000501010005070101050301000501
+010005020100050601010509010005050100050201000501010005020100051801000503
+010005010100050201000502010005010100050201000503010005050101050b01000503
+010005000100050001000501010005020100050101000501010105010100050101010504
+010005020100050201000503010105090100050201000501010005020100050101000502
+010005040100050501000509010005010101050101000502010005030100050301000502
+010005010100050101010504010005040100050501000505010005c4000105010701060d
+030002020401030102020400050407010503010005040101050401010503010205020104
+050301010504010105020100050701010509010005060102050301020519010005030100
+050101000502010005020100050201020504010005050101050b01000503010005000100
+050001000502010205030101050001000502010105000100050401000503010205040101
+050a01020502010005020100050201020505010005050100050a01010500010005020102
+050401000504010305020101050001000504010005050101050301000505010005c40001
+05010701060d0300020204010301020204000504070105040100052a0100054001000522
+0100050b010005300100052b0105053401000505010005c4000105010701060d03000202
+04010301020204000504070105730101051e0101050d0101052c01010565010105040101
+05c5000105010701060d0300020204010301020204000504070105ff05ff050a00010501
+0701060d0300020204010301020204000504070105ff05060101055f0101056301010515
+01010521000105010701060d0300020204010301020204000504070105040100052a0100
+051d010005b401000506010005040100053e01000512010005070100052a010005150100
+0501010005180100051301000523000105010701060d0300020204010301020204000504
+07010503010005040101050a010205030102050b010105020100051c0100051f01040519
+010105040100050301020540010005030100051f01000506010005030102052d01020503
+010205050100051201000506010005040101050a010205030102050b0101050201000514
+01000501010005010103050c010105030100051301000504010205050100050b01000507
+000105010701060d03000202040103010202040005040701050201000504010005010100
+05080100050201000501010005020100050901000501010005020100051b010005210100
+051a0100050d01000540010005030100051f010005050100050301000500010005000100
+052e01000505010005040100051301000505010005040100050101000508010005020100
+050101000502010005090100050101000502010005130100050101000501010005020100
+050a0100050501000513010005060100051201000507000105010701060d030002020401
+03010202040005040701050101000505010005010100050c010005050100050901000501
+0100050301000505010105120100052101000504010205040101050b0100050401020505
+010005030102050a01020503010205020100050001010502010005020100050201020502
+010005000101050801010501010105020102050301010500010005030101050b01000504
+010005040100050001000504010105000100050201020502010005000101050a01020503
+010205050100050501000503010005140100050401000505010005010100050c01000505
+010005090100050101000503010005110105050001000502010005020102050401000505
+010005130100050601000503010205030102050201040505000105010701060d03000202
+040103010202040005040701050001000506010005010100050c01000505010005090100
+050101000504010005040101051201000521010005030100050201000503010105090104
+050401000505010005020100050201000508010005020100050101000502010005010101
+050101000501010005020100050101000502010005010101050101000507010105010101
+0501010005020100050101000501010105030101050b0100050a01000500010005030100
+050101010501010005020100050101010501010005080100050201000501010005020100
+050401000505010005190100050301000506010005010100050c01000505010005090100
+050101000504010005110100050101000501010005020100050101000502010005010104
+050301000513010005060100050501000502010005020100050301000507000105010701
+060d0300020204010301020204000504070101000507010005010100050a010105050100
+050a01000501010005050100051801000521010005030100050201000511010005060100
+050501000502010005020100050801000505010005020100050101000505010005020100
+050101000502010005010100050b01000500010105000100050101000505010005020100
+050f0101050c010205020100050201000501010005020100050101000502010005080100
+05090100050401000505010005170101050301000507010005010100050a010105050100
+050a01000501010005050100050f01000501010005020103050201000502010005030100
+05060101050f0101050701000505010005020100050701000507000105010701060d0300
+0202040103010202040005040701050001000506010005010100050c010005030100050b
+010005010100050401000519010005210100050301000502010005110100050601000505
+01000502010405090102050201040501010005060100050001000502010405010100050b
+0100050001010500010005020102050201000502010005110100050c0100050001000501
+010005020100050101040501010005020100050801000506010305040100050501000519
+0100050301000506010005010100050c010005030100050b01000501010005040100050f
+010505010100050101000502010405030100050501000513010005060100050501000503
+0102050401000507000105010701060d0300020204010301020204000504070105010100
+0505010005010100050c010005020100050c01000501010005030100053d010005030100
+050201000511010005060100050501000502010005100100050101000505010005060100
+050001000502010005050100050b01000503010005050100050101000502010005110100
+050c01000500010005010100050201000501010005050100050201000508010005050100
+05020100050401000505010005190100050401000505010005010100050c010005020100
+050c01000501010005030100051101000501010005020100050201000501010005070100
+0505010005130100050601000505010005060100050301000507000105010701060d0300
+020204010301020204000504070105020100050401000501010005030101050201000502
+010005010100050701010503010005010100050201000506010105350100050301000502
+010005030101050b01000506010005050100050201000502010005080100050201000501
+0100050201000501010005070100050301000502010005010100050b0100050301000501
+010005020100050101000501010105030101050b0100050a010005000100050001000501
+010005010101050101000502010005010100050201000508010005020100050101000502
+01000504010005050100050b0101050b0100050501000504010005010100050301010502
+010005020100050101000507010105030100050101000502010005060101050901000501
+010005020100050201000501010005020100050301000505010005050101050b01000506
+0100050501000502010005020100050301000507000105010701060d0300020204010301
+020204000504070105030100050401010504010105030102050201040503010105040101
+050201000507010105120100052101000504010205040101050b01000506010005050100
+05030102050a01020503010205020100050701000504010205020100050b010005030100
+05020102050301010500010005030101050b0100050b0102050301010500010005020102
+050201000502010005090102050301030504010005050100050b0101050b010005060100
+050401010504010105030102050201040503010105040101050201000507010105090100
+05010100050201000502010005020102050401000505010005050101050b010005060100
+0505010005030102050501010505000105010701060d0300020204010301020204000504
+070105040100052a0100057501050544010005110100050c010005070100050e01050527
+0100050b010005070100052a0100050901000527010005060100050b0100051e01040001
+05010701060d0300020204010301020204000504070105ee01000502010005120101050f
+010005020100053a0101050d0101053a01010526010105050101050d0101052100010501
+0701060d0300020204010301020204000504070105ef01020526010205ed000105010701
+060d0300020204010301020204000504070105730101052e010105ff0563000105010701
+060d0300020204010301020204000504070105040100052a010005400100050401000501
+010005260100052001030501010005010100058701000501010005ae000105010701060d
+030002020401030102020400050407010503010005040101050a010205030102050b0101
+05020100053f0100050401000501010005010103050c010105110100050a010005140100
+050401000501010005340102050401000503010405020102051001000508010005180100
+05010100050101000501010005ae000105010701060d0300020204010301020204000504
+070105020100050401000501010005080100050201000501010005020100050901000501
+010005020100053e010005040100050101000501010005020100050a010005130100050a
+010005140100050401000501010005330100050201000502010105030100050501000502
+0100050f0100052101000500010005000100050101000501010005ae000105010701060d
+03000202040103010202040005040701050101000505010005010100050c010005050100
+050901000501010005030100050501010509010005000101050301020503010205190100
+050301050500010005020100050201020504010005130100050401020502010005010100
+051101000504010005010100050a01020503010205020100050201000502010205030102
+050901000505010005000100050301000505010005020100050901020502010005000101
+050301020502010005020100050201020503010205020100050101000502010005010100
+05ae000105010701060d0300020204010301020204000504070105000100050601000501
+0100050c0100050501000509010005010100050401000504010105090101050101000501
+010005020100050101000502010005180100050401000501010005010100050201000501
+010005020100050101040511010005030100050201000501010005000100051201000512
+010005020100050101000502010005010100050201000501010005020100050101000502
+010005080100050701000503010305020100050201000508010005020100050101010501
+01000504010005020100050201000501010005020100050101000502010005bb00010501
+0701060d0300020204010301020204000504070101000507010005010100050a01010505
+0100050a01000501010005050100050f0100050501000502010005010100051a01010504
+010005010100050201030502010005020100050301000511010105040100050201000501
+010105130100051201000509010005010100050201000501010005020100050101000505
+010405010103050401000507010005020103050101040501010005050100050201000504
+01000502010005020100050501000501010005bf000105010701060d0300020204010301
+0202040005040701050001000506010005010100050c010005030100050b010005010100
+05040100051001000505010405010100051c010005020105050101000501010005020104
+050301000513010005030100050201000501010105130100051301020503010305020100
+050001000502010405020102050901000502010005030100050701000505010005080100
+0505010005020100050401000503010005000100050301030502010205bc000105010701
+060d03000202040103010202040005040701050101000505010005010100050c01000502
+0100050c01000501010005030100051101000505010005050100051c0100050301000501
+010005020100050201000501010005070100051301000503010005020100050101000500
+010005120100051601000501010005020100050201000500010005020100050901000508
+010005020100050301000503010005020100050501000508010005050100050201000504
+0100050301000500010005020100050201000505010005bb000105010701060d03000202
+040103010202040005040701050201000504010005010100050301010502010005020100
+050101000507010105030100050101000502010005060101050901000505010005020100
+050101000502010005180100050301000501010005020100050201000501010005020100
+0503010005050101050b01000503010005020100050101000501010005040101050a0100
+050d01010502010005020100050101000502010005030100050301000502010005010100
+050201000508010005020100050301000503010005020100050101000502010005080100
+050201000501010005020100050401000504010005030100050201000501010005020100
+0511010105a7000105010701060d03000202040103010202040005040701050301000504
+010105040101050301020502010405030101050401010502010005070101050901000506
+010205030102051901000503010005010100050201000502010005020102050401000505
+0101050b010005040102050201000502010005030101050a0100050d0101050301020503
+0103050301000504010205030102050a0102050201040502010205030102050a01020502
+010005020100050401000504010005040103050201020512010105a7000105010701060d
+0300020204010301020204000504070105040100052a01000540010005220100050b0100
+05140100050a01030597010005a7000105010701060d0300020204010301020204000504
+070105730101051e0101050d01010510010105a5010105a8000105010701060d03000202
+04010301020204000504070105ff05ff050a000105010701060d03000202040103010202
+04000504070105ff05ff050a000105010701000d03000202040103010202040005040701
+0507010005010100056401000501010005ff05950001050107010600000c030002020401
+03010202040005040701050701000501010005040100051201020521010105050100050b
+0100051001000501010005ff059500010501070106000001050807010300020204010301
+0202040005040701050701000501010005040100051401000520010005070100051d0100
+0501010005ff059500010501070106010001050707010300020204010301020204000504
+0701050701000501010005020104050201020503010205050100050a0101050001000502
+010205020100050001010504010005040101050001000509010205030102050201010500
+0100050201000501010005ff059500010501070106010001050607010600030002020401
+030102020400050407010510010005030100050201000501010005020100050401000509
+01000501010105010100050201000501010105010100050101040501010005010101050b
+0100050201000502010005010100050001000500010005ff059b00010501070106020001
+050507010600030002020401030102020400050407010510010005030100050201000501
+010005020100050401000509010005020100050101000502010005010100050201000503
+01000503010005020100050b01000506010005010100050001000500010005ff059b0001
+050107010602000105040701060103000202040103010202040005040701051001000503
+010005020100050101000502010005040100050901000502010005010104050101000502
+0100050301000503010005020100050b01000503010305010100050001000500010005ff
+059b00010501070106030001050307010601030002020401030102020400050407010510
+010005030100050201000501010005020100050401000509010005020100050101000505
+010005020100050301000503010005020100050b01000502010005020100050101000500
+01000500010005ff059b0001050107010603000105020701060203000202040103010202
+040005040701051001000503010005020100050101000502010005040100050901000501
+010105010100050201000501010005020100050301000503010005010101050301010505
+01000502010005020100050101000500010005000100050a010105ff058e000105010701
+060400010501070106020300020204010301020204000504070105110101050201020503
+010205050100050a01010500010005020102050201000502010005030100050401010500
+0100050301010505010005030103050101000500010005000100050a010105ff058e0001
+050107010604000105000701060303000202040103010202040005040701052901050505
+010005270100051a010005ff058e00010501070106050000070206030300020204010301
+0202040005040701053101000502010005240100050101000518010105ff058f00010501
+070106050000070106040300020204010301020204000504070100ff00ff000c05010701
+0606070106040300020204010301020204000504070000ff00ff000d0501070106060700
+060503000202040103010202040005ff05ff05150701000d030002020401030102020400
+05ff05ff05150700000e030002020401030102020400050207ff07ff0716050b03000202
+0401030102020400050207ff07ff07150000050b03000202040103010202040005020701
+060d0000060000ff0073067f0001060c0001050b03000202040103010202040005020701
+060b00010700060000ff00720700067f0003060a0001050b030002020401030102020400
+050207010609000207010600000105ff056f0701067f000506080001050b030002020401
+0301020204000502070106070003050007010600000105ff056f0701067f000105010003
+06060001050b030002020401030004040502070106050003050207010600000105ff056f
+0701067f00010503000306040001050b0300040403050502070106030003050407010600
+000105ff056f0701067f00010505000306020001050b0304040003010202040005020701
+06010003050607010600000105ff056f0701067f00010507000306000001050b03000202
+040103010202040005020705050807010600000105ff056f0701067f0001050807030001
+050b0300020204010301020204000502070106010703050607010600000105ff056f0701
+067f00010507070306000001050b03000202040103010202040005020701060307030504
+07010600000105ff056f0701067f00010505070306020001050b03000202040103010202
+04000502070106050703050207010600000105ff056f0701067f00010503070306040001
+050b0300020204010301020204000502070106070703050007010600000105ff056f0701
+067f00010501070306060001050b03000202040103010202040005020701060907040600
+000105ff056f0701067f0001070306080001050b03000202040103010202040005020701
+060b07020600000107ff0771067f00010701060a0001050b030002020401030102020400
+05020701060d07000600000007ff0772067f00000700060c0001050b0300020204010301
+020204000502070100ff00ff0014050b0300020204010301020204000502070000ff00ff
+0015050b03000202040103010202040005ff05ff052503000202040103010202040005ff
+05ff052503000202040103010202040005ff05ff052503000202040103010202040005ff
+05ff052503000202040103010202040005ff05ff052503000202040103010202040005ff
+05ff052503000202040103010202040005ff05ff052503000202040103010202040005ff
+05ff052503000202040103010202040005ff05ff052503000202040103010202040005ff
+05ff052503000202040103010202040005ff05ff052503000202040103010202040005ff
+05ff052503000202040103010202040003ff03ff0326020204010301021a0400030002ff
+02f304000300021a04010301021a0400030002ff02f304000300021a04010301021a0400
+030002ff02f304000300021a04010301041b030004ff04f40300041c030004ff04ff0430
+
+%%EndData
+end
+%%PageTrailer
+%%Trailer
+%%BoundingBox: 0 17 377 309
+%%EOF
diff --git a/lib/pman/doc/src/warning.gif b/lib/pman/doc/src/warning.gif
new file mode 100644
index 0000000000..96af52360e
--- /dev/null
+++ b/lib/pman/doc/src/warning.gif
Binary files differ
diff --git a/lib/pman/ebin/.gitignore b/lib/pman/ebin/.gitignore
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/pman/ebin/.gitignore
diff --git a/lib/pman/info b/lib/pman/info
new file mode 100644
index 0000000000..22003edcea
--- /dev/null
+++ b/lib/pman/info
@@ -0,0 +1,2 @@
+group: tools
+short: A graphical process manager used to inspect Erlang processes.
diff --git a/lib/pman/priv/Makefile b/lib/pman/priv/Makefile
new file mode 100644
index 0000000000..43f9d45d94
--- /dev/null
+++ b/lib/pman/priv/Makefile
@@ -0,0 +1,58 @@
+# ``The contents of this file are subject to the Erlang Public License,
+# Version 1.1, (the "License"); you may not use this file except in
+# compliance with the License. You should have received a copy of the
+# Erlang Public License along with this software. If not, it can be
+# retrieved via the world wide web at http://www.erlang.org/.
+#
+# Software distributed under the License is distributed on an "AS IS"
+# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+# the License for the specific language governing rights and limitations
+# under the License.
+#
+# The Initial Developer of the Original Code is Ericsson Utvecklings AB.
+# Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
+# AB. All Rights Reserved.''
+#
+# $Id$
+#
+include $(ERL_TOP)/make/target.mk
+include $(ERL_TOP)/make/$(TARGET)/otp.mk
+
+include ../vsn.mk
+VSN = $(PMAN_VSN)
+
+# ----------------------------------------------------
+# Release directory specification
+# ----------------------------------------------------
+RELSYSDIR = $(RELEASE_PATH)/lib/pman-$(VSN)
+
+#
+# Macros
+#
+TOOLBAR_FILES = \
+ pman.tool \
+ pman.gif
+
+#
+# Rules
+#
+
+debug opt:
+
+docs:
+
+clean:
+
+
+# ----------------------------------------------------
+# Release Target
+# ----------------------------------------------------
+include $(ERL_TOP)/make/otp_release_targets.mk
+
+release_spec: opt
+ $(INSTALL_DIR) $(RELSYSDIR)/priv
+ $(INSTALL_DATA) $(TOOLBAR_FILES) $(RELSYSDIR)/priv
+
+release_docs_spec:
+
+FORCE:
diff --git a/lib/pman/priv/pman.gif b/lib/pman/priv/pman.gif
new file mode 100644
index 0000000000..4575a397d8
--- /dev/null
+++ b/lib/pman/priv/pman.gif
Binary files differ
diff --git a/lib/pman/priv/pman.tool b/lib/pman/priv/pman.tool
new file mode 100644
index 0000000000..c04b7d00eb
--- /dev/null
+++ b/lib/pman/priv/pman.tool
@@ -0,0 +1,6 @@
+{version,"0.1"}.
+{{tool,"Pman"},
+ {start,{pman,start,[]}},
+ {icon,"pman.gif"},
+ {message,"Process Manager"},
+ {html,"../doc/html/index.html"}}.
diff --git a/lib/pman/src/Makefile b/lib/pman/src/Makefile
new file mode 100644
index 0000000000..e573e57220
--- /dev/null
+++ b/lib/pman/src/Makefile
@@ -0,0 +1,112 @@
+#
+# %CopyrightBegin%
+#
+# Copyright Ericsson AB 1996-2009. All Rights Reserved.
+#
+# The contents of this file are subject to the Erlang Public License,
+# Version 1.1, (the "License"); you may not use this file except in
+# compliance with the License. You should have received a copy of the
+# Erlang Public License along with this software. If not, it can be
+# retrieved online at http://www.erlang.org/.
+#
+# Software distributed under the License is distributed on an "AS IS"
+# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+# the License for the specific language governing rights and limitations
+# under the License.
+#
+# %CopyrightEnd%
+#
+include $(ERL_TOP)/make/target.mk
+include $(ERL_TOP)/make/$(TARGET)/otp.mk
+
+# ----------------------------------------------------
+# Application version
+# ----------------------------------------------------
+include ../vsn.mk
+VSN=$(PMAN_VSN)
+
+# ----------------------------------------------------
+# Release directory specification
+# ----------------------------------------------------
+RELSYSDIR = $(RELEASE_PATH)/lib/pman-$(VSN)
+
+# ----------------------------------------------------
+# Common Macros
+# ----------------------------------------------------
+
+MODULES= \
+ pman \
+ pman_main \
+ pman_shell \
+ pman_relay \
+ pman_relay_server \
+ pman_module_info \
+ pman_win \
+ pman_buf \
+ pman_buf_utils \
+ pman_buf_buffer \
+ pman_buf_converter \
+ pman_buf_printer \
+ pman_options \
+ pman_process \
+ pman_tool
+
+HRL_FILES= \
+ assert.hrl \
+ pman_buf.hrl \
+ pman_options.hrl \
+ pman_win.hrl
+
+ERL_FILES= $(MODULES:%=%.erl)
+
+TARGET_FILES = $(MODULES:%=$(EBIN)/%.$(EMULATOR)) $(APP_TARGET) $(APPUP_TARGET)
+
+APP_FILE = pman.app
+APP_SRC = $(APP_FILE).src
+APP_TARGET = $(EBIN)/$(APP_FILE)
+
+APPUP_FILE = pman.appup
+APPUP_SRC = $(APPUP_FILE).src
+APPUP_TARGET = $(EBIN)/$(APPUP_FILE)
+
+# ----------------------------------------------------
+# FLAGS
+# ----------------------------------------------------
+ERL_COMPILE_FLAGS += +warn_obsolete_guard
+
+# ----------------------------------------------------
+# Targets
+# ----------------------------------------------------
+
+debug opt: $(TARGET_FILES)
+
+clean:
+ rm -f $(TARGET_FILES)
+ rm -f errs core *~
+
+$(APP_TARGET): $(APP_SRC) ../vsn.mk
+ sed -e 's;%VSN%;$(VSN);' $< > $@
+
+$(APPUP_TARGET): $(APPUP_SRC) ../vsn.mk
+ sed -e 's;%VSN%;$(VSN);' $< > $@
+
+docs:
+
+# ----------------------------------------------------
+# Special Targets
+# ----------------------------------------------------
+
+
+# ----------------------------------------------------
+# Release Target
+# ----------------------------------------------------
+include $(ERL_TOP)/make/otp_release_targets.mk
+
+release_spec: opt
+ $(INSTALL_DIR) $(RELSYSDIR)/src
+ $(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) $(TOOLBOX_FILES) $(RELSYSDIR)/src
+ $(INSTALL_DIR) $(RELSYSDIR)/ebin
+ $(INSTALL_DATA) $(TARGET_FILES) $(TARGET_TOOLBOX_FILES) $(RELSYSDIR)/ebin
+
+release_docs_spec:
+
diff --git a/lib/pman/src/assert.hrl b/lib/pman/src/assert.hrl
new file mode 100644
index 0000000000..ea3b68cd7c
--- /dev/null
+++ b/lib/pman/src/assert.hrl
@@ -0,0 +1,81 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+%%% Purpose : Assert macro
+
+
+%% ?ASSERT/2 - will simply return true if the first argument evaluates to true
+%% otherwise it will exit and output (via the error logger) the
+%% second string
+%%
+%% Arguments:
+%% Flag Expression that should evalueate to true or false
+%% String String to return as a part of the exit reason as well
+%% be to be sent to the error logger.
+%%
+%% Returns:
+%% true If the Flag expression evaluates to true
+%%
+%% Exits:
+%% {'EXIT', {assertion_failed, String}}
+%% If the Flag expression evaluates to something other than
+%% true.
+%%
+%% Usage notes:
+%% Please note that the Flag argument must be a valid expression that
+%% evaluates to true.
+%%
+%% Also, avoid any side effects in the Flag, as everything performed
+%% within the scope of the ?ASSERT macro will not be present when
+%% the code is not compiled with the debug_on flag.
+%%
+%% Side effects include the binding of a variable, sending of a
+%% message, etc.
+%%
+
+-ifdef(debug_on).
+-define(ASSERT(Flag, String),
+ case Flag of
+ true ->
+ true;
+ _ ->
+ S2 =
+ lists:flatten(
+ io_lib:format(
+ "=ASSERT====~nPid:~p, Module:~p, Line:~p~nTermination because assertion failed:~n~p",
+ [self(),?MODULE, ?LINE,String])),
+ error_logger:error_report(S2),
+ exit({assertion_failed, String})
+ end
+ ).
+
+-define(ALWAYS_ASSERT(String),
+ S2 = lists:flatten(
+ io_lib:format(
+ "=ASSERT====~nPid:~p, Module:~p, Line:~p~nTermination because of unconditional assert:~n~p",
+ [self(),?MODULE, ?LINE, String])),
+ error_logger:error_report(S2),
+ exit({always_assert, String})
+ ).
+-else.
+-define(ASSERT(_Flag,_String), true).
+-define(ALWAYS_ASSERT(_String), true).
+-endif.
+
+
+
diff --git a/lib/pman/src/pman.app.src b/lib/pman/src/pman.app.src
new file mode 100644
index 0000000000..cc32a17296
--- /dev/null
+++ b/lib/pman/src/pman.app.src
@@ -0,0 +1,40 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+{application, pman,
+ [{description, "pman The Process Manager"},
+ {vsn, "%VSN%"},
+ {modules, [
+ pman,
+ pman_buf,
+ pman_buf_buffer,
+ pman_buf_converter,
+ pman_buf_printer,
+ pman_buf_utils,
+ pman_main,
+ pman_module_info,
+ pman_options,
+ pman_process,
+ pman_relay,
+ pman_relay_server,
+ pman_shell,
+ pman_tool,
+ pman_win
+ ]},
+ {registered, []},
+ {applications, [kernel, stdlib]}]}.
diff --git a/lib/pman/src/pman.appup.src b/lib/pman/src/pman.appup.src
new file mode 100644
index 0000000000..7a435e9b22
--- /dev/null
+++ b/lib/pman/src/pman.appup.src
@@ -0,0 +1,19 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2001-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+{"%VSN%",[],[]}.
diff --git a/lib/pman/src/pman.erl b/lib/pman/src/pman.erl
new file mode 100644
index 0000000000..c8ea34b6b7
--- /dev/null
+++ b/lib/pman/src/pman.erl
@@ -0,0 +1,132 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1996-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+%%----------------------------------------------------------------------
+%%% Purpose : Exported API to the Pman graphical tool
+%%----------------------------------------------------------------------
+
+-module(pman).
+
+
+%% ---------------------------------------------------------------
+%% The user interface exports
+%% ---------------------------------------------------------------
+-export([start/0,
+ start_notimeout/0,
+ start/1,
+ start_notimeout/1,
+ proc/1,
+ proc/3]).
+
+%% ---------------------------------------------------------------
+
+%% Timeout for the startup function.
+%% If no {initialization_complete, Pid} message has been received
+%% from the spawned init-function within ?STARTUP_TIMEOUT ms
+%% the start-function will call exit(Reason).
+-define(STARTUP_TIMEOUT, 20000).
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% start/0
+
+start() ->
+ start([], ?STARTUP_TIMEOUT). %Start w/o excluded modules
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% start_notimeout/0
+
+start_notimeout() ->
+ start([],infinity). %Start w/o excluded modules
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% start/1
+
+start(LIModuleExcluded) ->
+ start(LIModuleExcluded, ?STARTUP_TIMEOUT).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% start_notimeout/1
+
+start_notimeout(LIModuleExcluded) ->
+ start(LIModuleExcluded, infinity).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% start/2 - Spawns the main Pman process, that will supervise
+%% all processes except those running code from the modules
+%% specified in LIModuleExcluded
+%%
+
+start(LIModuleExcluded, Timeout) ->
+
+ OSModuleExcluded = ordsets:from_list(LIModuleExcluded),
+
+ PidInit = spawn(pman_main, init, [self(), OSModuleExcluded]),
+
+ %% Wait for a initialization completion message from
+ %% the spawned process before returning its Pid.
+ %%
+
+ receive
+ {initialization_complete, PidInit} ->
+ PidInit
+
+ %% (Conditional) Failure to start within the time limit will
+ %% result in termination
+
+ after
+ Timeout ->
+ exit(PidInit, kill),
+ exit({startup_timeout, ?MODULE})
+ end.
+
+
+
+%% ---------------------------------------------------------------
+%% If we want to trace just one process, we can call proc, giving it
+%% either the Pid, or the registered name, (Global or local).
+%%
+%% (???)
+%% Note that this function must not be used internally to create a
+%% trace window, since it is assumed that it is started from any
+%% process (esp. the shell) it will not have any supervisor process
+%% that shall be notified about it's exit/death.
+%%
+%% Returns: Trace loop Pid|udefined
+
+%% ---------------------------------------------------------------
+
+
+proc(undefined) ->
+ exit(undefined);
+
+proc({shell,P}) when is_pid(P) ->
+ pman_shell:start({{shell,P},self()});
+
+proc(P) when is_atom(P) ->
+ proc(whereis(P));
+
+proc({global, N}) ->
+ proc(global:whereis_name(N));
+
+proc(P) when is_pid(P) ->
+ pman_shell:start({P,self()}).
+
+proc(X,Y,Z) ->
+ proc(c:pid(X,Y,Z)).
+
diff --git a/lib/pman/src/pman_buf.erl b/lib/pman/src/pman_buf.erl
new file mode 100644
index 0000000000..d56ce184fa
--- /dev/null
+++ b/lib/pman/src/pman_buf.erl
@@ -0,0 +1,117 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+%%%----------------------------------------------------------------------
+%%% Purpose : This module is the exported interface to the buffering mechanism
+%%% used in PMAN to prevent the trace output to congest
+%%% the system.
+%%%
+%%% This module depends on the modules (direct or indirectly):
+%%% pman_buf.hrl
+%%% pman_buf_utils.erl
+%%% pman_buf_buffer.erl
+%%% pman_buf_converter.erl
+%%% pman_buf_printer.erl
+%%%
+%%%----------------------------------------------------------------------
+
+-module(pman_buf).
+
+%%-compile(export_all).
+-export([start/2,clear/3]).
+
+
+-include("pman_buf.hrl").
+
+
+%% The buffering mechanism consists of three processes that
+%% work in a chain to prevent the process monitor from congesting
+%% output mechanism.
+%%
+%% Messages are buffered in the CONVERTER process before they are sent to
+%% to the BUFFER process where they are formatted before they are finally
+%% sent to either a file or the PRINTER process. The printer process
+%% outputs the messages in the graphical user interface.
+%%
+%%
+%%
+%% --> CONVERTER --> BUFFER --> PRINTER --> gui
+%% |
+%% |
+%% |
+%% V
+%%
+%% file
+%%
+
+
+
+
+
+%% ----------------------------------------------------------------
+%% The amount of data produced by a trace message may be large, and
+%% cause the run time system to run out of memory. To avoid this,
+%% the task of storing, cutting buffers, formating data and printing
+%% it is performed by three processes: The buffer, the converter and
+%% the printer.
+%%
+%% The converter accepts the raw data, a list
+%% of {trace,Msg} tuples. Having max priority, it assures that the
+%% amount of raw data stored never excedes ?BUFF_SIZE messages.
+%% (With the exception of the last batch received, which assures that
+%% the last trace message printed is never a buffer cut message.)
+%% Whenever there is space available in the buffer process, (The
+%% Buffer process stores max. ?BUFF_SIZE converted messages),
+%% the buffer asks for more unconverted messages, and ?PRINT_LEN messages
+%% are sent. They are converted by the buffer, and added to the list
+%% of messages to be sent.
+
+%% The printer process requests formatted messages from the buffer,
+%% and in chuncs of ?MAX_OUTPUT sends them to the buffer. If traces
+%% are to be dumped on file, due to the max priority, such is handled
+%% in the converter, and buffers are not cut.
+%%
+
+
+%% ---------------------------------------------------------------
+%% Initializes the buffering mechanism, which consist of three
+%% processes, each involved with a phase of the formattation and
+%% output of data to the process windows.
+
+start(Editor, FileName) ->
+ Buffer_Pid = spawn_link(pman_buf_buffer,init,[Editor]),
+ Converter_Pid =
+ spawn_link(pman_buf_converter,init,[Buffer_Pid, FileName]),
+ Buffer_Pid!{converter_pid, Converter_Pid},
+ #buffer{converter=Converter_Pid,buffer=Buffer_Pid}.
+
+
+
+%% ---------------------------------------------------------------
+%% Kills the converter and the clears the buffer with formated data
+%% starting a new converter.
+
+clear(Buff,String, FileName) ->
+ exit(Buff#buffer.converter,win_killed),
+ Converter_Pid=spawn_link(pman_buf_converter,init,[Buff#buffer.buffer,
+ FileName]),
+ Buff#buffer.buffer!{clear,String,Converter_Pid },
+ Buff#buffer{converter = Converter_Pid}.
+
+
+
diff --git a/lib/pman/src/pman_buf.hrl b/lib/pman/src/pman_buf.hrl
new file mode 100644
index 0000000000..3f25dcc5f0
--- /dev/null
+++ b/lib/pman/src/pman_buf.hrl
@@ -0,0 +1,29 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+
+%%-compile(export_all).
+%%-export([Function/Arity, ...]).
+
+-define(BUFF_SIZE,1000).
+-define(EDITOR_MAX,10000).
+-define(PRINT_LEN,50).
+-define(MAX_OUTPUT,5000).
+
+
+-record(buffer,{buffer,converter}).
diff --git a/lib/pman/src/pman_buf_buffer.erl b/lib/pman/src/pman_buf_buffer.erl
new file mode 100644
index 0000000000..ad92eb1f3e
--- /dev/null
+++ b/lib/pman/src/pman_buf_buffer.erl
@@ -0,0 +1,102 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+%%%----------------------------------------------------------------------
+%%% Purpose : The purpouse of the buffer process is to take
+%%% care of the data that is received by the converter
+%%% process and pass it on to the printer process in chunks
+%%% that can be handled.
+%%%
+%%% This module is a part of the buffering system, and
+%%% should not be used except through the API defined
+%%% in the pman_buf module.
+%%%
+%%%----------------------------------------------------------------------
+
+-module(pman_buf_buffer).
+
+%%-compile(export_all).
+-export([init/1]).
+
+-include("pman_buf.hrl").
+
+
+
+%%
+%% Initialization function for the buffer process.
+%% To be started with spawn from the calling process.
+%%
+
+init(Editor) ->
+ Printer_pid = spawn_link(pman_buf_printer,init,[Editor,self()]),
+ receive
+ {converter_pid,Pid} ->
+ Pid!{buffer,accept},
+ buffer_loop([],0,0,Printer_pid,Pid)
+ end.
+
+
+
+%%
+%% Receive loop for the buffer process.
+%%
+
+buffer_loop(Buffer,Size,Acc,Printer,Converter) ->
+ receive
+ {save_buffer,Name} ->
+ Printer!{save_buffer,Name},
+ buffer_loop(Buffer,Size,Acc,Printer,Converter);
+ {raw,Raw,Length} -> %%output to editor
+ New_Size = Size + Length,
+ if New_Size < ?BUFF_SIZE ->
+ Converter!{buffer,accept};
+ true -> ok
+ end,
+ Print = lists:map(fun(X) -> pman_buf_utils:textformat(X) end, Raw),
+ New_Buff = lists:append(Buffer,Print),
+ buffer_loop(New_Buff,New_Size,Acc,Printer,Converter);
+ {clear,Text,N_Converter} ->
+ Converter!{buffer,accept},
+ Printer!clear,
+ buffer_loop([Text],1,1,Printer,N_Converter);
+ {printer,send} when Buffer /= [] ->
+ if
+ Acc > ?EDITOR_MAX ->
+ Printer!clear,
+ Printer !{buffer,"Cleared Buffer due to Size\n\n"},
+ buffer_loop(Buffer,Size,1,Printer,Converter);
+ true ->
+ {Length,Rest,Print} = pman_buf_utils:split(Buffer,
+ ?PRINT_LEN,
+ 0,
+ []),
+ Printer ! {buffer,Print},
+ New_Size = Size - Length,
+ if New_Size < ?BUFF_SIZE ->
+ Converter!{buffer,accept};
+ true -> ok
+ end,
+ buffer_loop(Rest,New_Size,Acc+Length,Printer,Converter)
+ end;
+ {converter,file} ->
+ Converter!{buffer,Buffer},
+ self()!{raw,[to_file],1},
+ buffer_loop([],0,Acc,Printer,Converter)
+ end.
+
+
diff --git a/lib/pman/src/pman_buf_converter.erl b/lib/pman/src/pman_buf_converter.erl
new file mode 100644
index 0000000000..b6f560411c
--- /dev/null
+++ b/lib/pman/src/pman_buf_converter.erl
@@ -0,0 +1,189 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+%%----------------------------------------------------------------------
+%% Purpose : The purpouse of the converter process is to take
+%% care of the raw data that is received by the tracing
+%% process (a pman_shell process) and pass it on to
+%% the buffer process in chunks that can be handled.
+%%
+%% This module is a part of the buffering system, and
+%% should not be used except through the API defined
+%% in the pman_buf module.
+%%
+%%----------------------------------------------------------------------
+
+-module(pman_buf_converter).
+
+%%-compile(export_all).
+-export([init/2]).
+
+-include("pman_buf.hrl").
+
+
+%% ---------------------------------------------------------------
+%% Starts the process which received the raw data from the debugger,
+%% cuts and forwards it to the buffer in smaller chunks. High priority
+%% to avoid large message queues waiting to be processed.
+
+init(Buffer_Pid, FileName) ->
+ process_flag(priority, max),
+ converter_loop(Buffer_Pid,[],0,true,[], FileName).
+
+converter_loop(Buffer_Pid,Raw,Size,State,Last, FileName) ->
+ receive
+ {file,Shell} ->
+ case init_file(lists:append(Raw,Last),
+ FileName,
+ Shell,
+ Buffer_Pid) of
+ true -> converter_loop(Buffer_Pid,
+ [to_buffer],
+ 1,
+ State,
+ [],
+ FileName);
+ false -> converter_loop(Buffer_Pid,
+ Raw,
+ Size,
+ State,
+ Last,
+ FileName)
+ end;
+ {raw,Trace} ->
+ {New_Raw,New_Size,New_State,New_Last} =
+ converter_data(Trace, Buffer_Pid, Raw, Size, State, Last),
+ converter_loop(Buffer_Pid,
+ New_Raw,
+ New_Size,
+ New_State,
+ New_Last,
+ FileName);
+ {buffer,accept} when Raw /= [] ->
+ {Length,Rest,Print} = pman_buf_utils:split(Raw,?PRINT_LEN,0,[]),
+ Buffer_Pid!{raw,Print,Length},
+ converter_loop(Buffer_Pid,Rest,Size-Length,false,Last,FileName);
+ {buffer,accept} when Last /= [] ->
+ {New_Raw,New_Size,New_State,New_Last} =
+ converter_data(Last,Buffer_Pid,Raw,Size,true,[]),
+ converter_loop(Buffer_Pid,
+ New_Raw,
+ New_Size,
+ New_State,
+ New_Last,
+ FileName);
+ {buffer,accept} ->
+ converter_loop(Buffer_Pid,Raw,Size,true,Last, FileName);
+ {clear,Str} ->
+ Buffer_Pid!{clear,Str},
+ converter_loop(Buffer_Pid,[],0,State,Last,FileName)
+ end.
+
+converter_data(Trace,Buffer_Pid,Raw,Size,State,Last) ->
+ if
+ ?BUFF_SIZE - Size > 0 ->
+ {Len,Rest,New_Trace} = pman_buf_utils:split(Trace,
+ ?BUFF_SIZE-Size,
+ 0,[]),
+ {New_Raw,New_Last} =
+ case Rest of
+ [] ->
+ {lists:append(Raw,New_Trace),Last};
+ [_|_] ->
+ case Last of
+ [] ->
+ {lists:append(Raw,New_Trace),Rest};
+ _ ->{lists:concat([Raw,New_Trace,[cut_buffer]]),
+ Rest}
+ end
+ end,
+ case State of true ->
+ {Length,Cut_Raw,Print} = pman_buf_utils:split(New_Raw,
+ ?PRINT_LEN,
+ 0,[]),
+ Buffer_Pid!{raw,Print,Length},
+ {Cut_Raw,Size-Length,false,New_Last};
+ _ ->
+ {New_Raw,Size+Len,false,New_Last}
+ end;
+ true ->
+ {Raw,Size,State,Trace}
+ end.
+
+
+%% ---------------------------------------------------------------
+%% Initializes the environment for saving the trace to file. The
+%% actual saving is taken care of by the buffer process.
+
+init_file(Raw,FileName, Name,Buffer_Pid) ->
+ case open_file(FileName, Name) of
+ {false,T} ->
+ pman_win:msg_win(T),
+ false;
+ {File,T} ->
+ Buffer_Pid!{converter,file},
+ pman_win:dialog_window(gs:start(),T),
+ save_loop_init(File,Raw)
+ end.
+
+open_file(FileName, _Shell) ->
+%% L = "pman_trace." ++ Shell,
+ case file:open(FileName, [read,write]) of
+ {error, _} ->
+ Str = "ERROR: Could not create_file\n" ++ FileName,
+ {false,Str};
+ {ok,File} ->
+ file:position(File, {eof, 0}),
+ Str1 = " Appending trace log to file\n" ++ FileName,
+ {File,Str1}
+ end.
+
+
+save_loop_init(Fd,Raw) ->
+ {Date, Time} = calendar:local_time(),
+ {Year, Month, Day} = Date,
+ {Hour, Minute, Second} = Time,
+ io:format(Fd,"%%% ~n",[]),
+ io:format(Fd,"%%% Trace output~n",[]),
+ io:format(Fd,"%%% Started at ~4p-~2p-~2p ~2p:~2p:~2p~n",
+ [Year, Month, Day,
+ Hour, Minute, Second
+ ]),
+ io:format(Fd,"%%% ~n~n",[]),
+
+ Print = lists:map(fun(X) -> pman_buf_utils:textformat(X) end, Raw),
+ receive
+ {buffer,Text} when is_list(Text) ->
+ io:format(Fd,Text,[]),
+ io:format(Fd,Print,[]),
+ save_loop(Fd)
+ end.
+
+save_loop(Fd) ->
+ receive
+ {raw,Raw} ->
+ Print = lists:map(fun(X) -> pman_buf_utils:textformat(X) end, Raw),
+ io:format(Fd,Print,[]),
+ save_loop(Fd);
+ buffer -> true
+ end.
+
+
+
+
+
diff --git a/lib/pman/src/pman_buf_printer.erl b/lib/pman/src/pman_buf_printer.erl
new file mode 100644
index 0000000000..74e935171a
--- /dev/null
+++ b/lib/pman/src/pman_buf_printer.erl
@@ -0,0 +1,89 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+
+-module(pman_buf_printer).
+
+%%-compile(export_all).
+-export([init/2]).
+
+
+-include("pman_buf.hrl").
+
+%% ---------------------------------------------------------------
+%% Starts the part of the buffer which regulates the flow of data to
+%% be printed in the pid editors
+
+
+init(Editor,Buffer_pid) ->
+ Buffer_pid!{printer,send},
+ printer_loop(Editor,Buffer_pid).
+
+printer_loop(Editor,Buffer_pid)->
+ receive
+ {save_buffer,Name} ->
+ gs:config(Editor,{save,Name}),
+ TT = "Buffer saved in file\n" ++ Name,
+ pman_win:dialog_window(gs:start(),TT),
+ printer_loop(Editor,Buffer_pid);
+ {buffer,Trace} ->
+ case lists:flatlength(Trace) of
+ Len when Len > ?MAX_OUTPUT ->
+ printer_long(lists:flatten(Trace),Editor),
+ Buffer_pid!{printer,send},
+ printer_loop(Editor,Buffer_pid);
+ _ ->
+ Buffer_pid!{printer,send},
+ print_trace(Editor,Trace),
+ printer_loop(Editor,Buffer_pid)
+ end;
+ clear ->
+ pman_win:configeditor(Editor, [{enable, true}]),
+ pman_win:configeditor(Editor,clear),
+ pman_win:configeditor(Editor, [{enable, false}]),
+ printer_loop(Editor,Buffer_pid);
+ _Other ->
+ printer_loop(Editor,Buffer_pid)
+ end.
+
+printer_long([],_) -> ok;
+printer_long(Trace,Editor) ->
+ receive
+ clear ->
+ pman_win:configeditor(Editor, [{enable, true}]),
+ pman_win:configeditor(Editor,clear),
+ pman_win:configeditor(Editor, [{enable, false}])
+ after 0 ->
+ {_Length,Rest,Print} = pman_buf_utils:split(Trace,
+ ?MAX_OUTPUT,
+ 0,
+ []),
+ print_trace(Editor,Print),
+ printer_long(Rest,Editor)
+ end.
+
+
+
+%% ---------------------------------------------------------------
+%% Function which print trace messages on the window
+%% ---------------------------------------------------------------
+
+print_trace(Editor,Elements) ->
+ pman_win:configeditor(Editor, [{enable, true}]),
+ pman_win:configeditor(Editor, [{insert, {'end',Elements}}]),
+ pman_win:configeditor(Editor, [{enable, false}]).
diff --git a/lib/pman/src/pman_buf_utils.erl b/lib/pman/src/pman_buf_utils.erl
new file mode 100644
index 0000000000..af3982665e
--- /dev/null
+++ b/lib/pman/src/pman_buf_utils.erl
@@ -0,0 +1,106 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+
+-module(pman_buf_utils).
+
+%%-compile(export_all).
+-export([textformat/1, split/4]).
+
+
+%% ---------------------------------------------------------------
+%% Funtion which format the trace message
+%% ---------------------------------------------------------------
+
+textformat(died) ->
+ "\n\nProcess died\n";
+textformat({died, Pid}) ->
+ io_lib:format("~w Process died.~n",[Pid]);
+textformat({shell_died, Old, New}) ->
+ io_lib:format("~w Shell Process died. Restarted as ~w~n~n",[Old,New]);
+
+
+textformat(to_buffer) ->
+ "\nAppending trace log to Buffer\n\n";
+textformat(to_file) ->
+ "\nAppending trace log to File\n\n";
+textformat(cut_buffer) ->
+ "\nCUT BUFFER\n\n";
+textformat({trace, From, 'receive', Msg}) ->
+ io_lib:format("~w: rec ~s~n", [From,
+ tuple_space(Msg)]);
+textformat({trace, From, send, Msg, To}) ->
+ io_lib:format("~w: ! To: ~w Msg: ~s~n", [From,
+ To,
+ tuple_space(Msg)]);
+textformat({trace, From, call, Func}) ->
+ io_lib:format("~w: call ~s~n",[From, ffunc(Func)]);
+textformat({trace, From, spawn, Data}) ->
+ io_lib:format("~w: spawn ~p~n", [From, Data]);
+textformat({trace, From, link, Data}) ->
+ io_lib:format("~w: link ~p~n", [From, Data]);
+textformat({trace, From, unlink, Data}) ->
+ io_lib:format("~w: U-lnk ~p~n", [From, Data]);
+
+textformat({trace, From, Op, Data}) ->
+ io_lib:format("~w: ~w ~p~n", [From, Op, Data]);
+
+textformat({print, Format, Args}) ->
+ io_lib:format(Format, Args);
+textformat(Other) ->
+ io_lib:format("~p~n",[Other]).
+
+
+
+
+
+ffunc({M,F, Argl}) ->
+ io_lib:format("~w:~w(~s)", [M, F, fargs(Argl)]);
+ffunc(X) -> tuple_space(X).
+fargs([]) -> [];
+fargs([A]) -> tuple_space(A); %% last arg
+fargs([A|Args]) -> [tuple_space(A),", "|fargs(Args)].
+
+
+tuple_space(X) when is_tuple(X) -> print(size(X), X, "}");
+tuple_space(X) -> io_lib:format("~p",[X]).
+
+print(0 , _X, Buff) -> ["{"|Buff];
+print(1 , X, Buff) ->
+ Str = tuple_space(element(1, X)),
+ ["{",Str|Buff];
+print(Num, X, Buff) ->
+ Str = tuple_space(element(Num, X)),
+ print(Num-1, X, [", ",Str|Buff]).
+
+
+
+%% ----------------------------------------------------------------
+%% splits the list at element Size, returns Size, and the 2 lists
+%% If the list is not long enough, it returns {size(List),[],List}
+
+
+split([],_,Length,Buff) ->
+ {Length,[],lists:reverse(Buff)};
+split(Rest,0,Length,Buff) ->
+ {Length,Rest,lists:reverse(Buff)};
+split([L|List],Size,Length,Buff) ->
+ split(List,Size-1,Length+1,[L|Buff]).
+
+
+
diff --git a/lib/pman/src/pman_main.erl b/lib/pman/src/pman_main.erl
new file mode 100644
index 0000000000..b68da1d2c3
--- /dev/null
+++ b/lib/pman/src/pman_main.erl
@@ -0,0 +1,787 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(pman_main).
+
+%% Main process and window
+
+-export([init/2]).
+
+-record(state, {win, % GS top window
+ frame, % GS top frame
+ grid, % GS process info grid
+
+ size, % int() No. of displayed procs
+ w, % int() Window width
+ h, % int() Window height
+
+ hide_system=false, % bool() Auto-hide system procs
+ hide_new=false, % bool() Auto-hide new processes
+
+ hide_modules, % ordset() Excluded modules
+
+ hide_all=[], % [{node(), bool()}] Hide all
+ hide_pids=[], % [{node(), Ordset}] Processes
+ % explicitly to hide, per node
+ show_pids=[], % [{node(), Ordset}] Processes
+ % explicitly to show, per node
+
+ shown_pids=[], % [{node(), Ordset}] Processes
+ % actually shown, per node
+
+ node, % node() Current node
+ nodes=[], % [node()] All known nodes
+
+ focus=1, % int() Grid line with focus
+ focus_pid=undefined, % pid() | undefined Proc in focus
+
+ noshell, % bool() Noshell mode on
+
+ options}). % term() Trace options settings
+
+
+-include("pman_win.hrl").
+
+-define(REFRESH_TIME,5000).
+
+-define(REQUIRES_FOCUS, % List of menus that should
+ ['Trace Process', % be disabled if no process
+ 'Kill', % is in focus
+ 'Hide Selected Process',
+ 'Module']).
+
+%%--Process init and loop-----------------------------------------------
+
+init(PidCaller, OSModuleExcluded) ->
+ process_flag(trap_exit, true),
+
+ %% Monitor all nodes in a distributed system
+ case is_alive() of
+
+ %% We have a distributed system
+ true -> net_kernel:monitor_nodes(true);
+
+ %% No distribution
+ false -> ignore
+ end,
+ Nodes = [node()|nodes()],
+
+ %% Create the main window
+ %% For some extremely strange reason, the frame must be resized
+ %% or the grid won't be visible...
+ GridSize = length(processes()) + 61,
+ {Window, Grid, Frame, Visible, W, H} =
+ pman_win:pman_window(GridSize, OSModuleExcluded, Nodes),
+ gse:resize(Frame, ?WIN_WIDTH, ?WIN_HEIGHT-?MENU_HEIGHT),
+
+ Noshell = case pman_shell:find_shell() of
+ noshell -> true;
+ _ -> false
+ end,
+
+ State1 = #state{win=Window, frame=Frame, grid=Grid,
+ size=Visible,
+ w=W, h=H,
+ hide_modules=OSModuleExcluded,
+ node=node(),
+ noshell=Noshell},
+
+ State2 = lists:foldl(fun(Node, State) -> add_node(Node, State) end,
+ State1,
+ Nodes),
+
+ State3 = refresh(State2),
+
+ %% Notify caller that the process appears
+ %% to have been started.
+ PidCaller ! {initialization_complete, self()},
+
+ %% Initiate a 'catch all' trace pattern so call tracing works
+ erlang:trace_pattern({'_', '_', '_'}, true, [local]),
+
+ %% Read default options file
+ Options = restore_options(State3),
+
+ loop(State3#state{options=Options}).
+
+add_node(Node, State) ->
+ pman_win:add_menu(node, [Node], "Show"),
+ State#state{hide_all=nl_update(Node, false, State#state.hide_all),
+ hide_pids=nl_update(Node, [], State#state.hide_pids),
+ show_pids=nl_update(Node, [], State#state.show_pids),
+ shown_pids=nl_update(Node, [], State#state.shown_pids),
+ nodes=[Node|State#state.nodes]}.
+
+%% Restore saved options from default file
+restore_options(State)->
+ File = options_file(),
+ case pman_options:read_from_file(File) of
+ {ok, Options} ->
+ Options;
+ {error, ReasonStr, DefOptions} ->
+ Parent = State#state.win,
+ Msg = io_lib:format(
+ "Problems reading default option file~n~s:~n~s",
+ [File, ReasonStr]),
+ tool_utils:notify(Parent, Msg),
+ DefOptions
+ end.
+
+options_file() ->
+ {ok, [[Home]]} = init:get_argument(home),
+ filename:join([Home, ".erlang_tools", "pman.opts"]).
+
+loop(State) ->
+ receive
+ {nodeup, Node} ->
+ case nl_exists(Node, State#state.hide_all) of
+ true ->
+ pman_win:add_menu(node, [Node], "Show"),
+ loop(State#state{nodes=[Node|State#state.nodes]});
+ false ->
+ loop(add_node(Node, State))
+ end;
+
+ {nodedown, Node} ->
+ pman_win:remove_menu([Node]),
+
+ Msg = io_lib:format("Node~n~p~ndown.", [Node]),
+ spawn_link(tool_utils, notify, [State#state.win, Msg]),
+
+ %% We remove Node from the list of nodes but not from
+ %% the other lists of State, in case Node reappears later
+ Nodes = lists:delete(Node, State#state.nodes),
+ State2 = State#state{nodes=Nodes},
+
+ %% If it was the shown node that went down,
+ %% change overview to this node
+ if
+ Node==State#state.node ->
+ State3 = execute_cmd({node,node()}, State2, [], []),
+ loop(State3);
+ true ->
+ loop(State2)
+ end;
+
+ %% Ignore EXIT signals from help processes
+ {'EXIT', _Pid, _Reason} ->
+ loop(State);
+
+ %% GS events
+ {gs, _Obj, _Event, _Data, _Args} = Cmd ->
+ case gs_cmd(Cmd, State) of
+ stop ->
+ exit(topquit);
+ State2 ->
+ loop(State2)
+ end
+
+ after ?REFRESH_TIME ->
+ State2 = refresh(State),
+ loop(State2)
+ end.
+
+%% gs_cmd(Event, State) -> stop | State'
+gs_cmd(Event, State) ->
+ case Event of
+
+ %% --- Window manager commands ---
+
+ %% Window is moved or resized
+ {gs, _, configure, _Data, Args} ->
+ configure(Args, State);
+
+ %% Window closed, stop Pman
+ {gs, _, destroy, _, _} ->
+ stop;
+
+ %% --- Dynamic commands ---
+
+ %% Click in any object where the GS Data field is a 2-tuple
+ {gs, _, click, Data, Args} when is_tuple(Data), size(Data)==2 ->
+ execute_cmd(Data, State, [], Args);
+
+ %% Single click in the grid sets focus to selected process
+ {gs, _, click, {pidfunc,_,_}, [_,Row|_]} when is_integer(Row) ->
+ focus(Row, State);
+
+ %% Double click in the grid starts tracing of selected process
+ {gs, _, doubleclick, {pidfunc,_,_}, [_Col,Row| _]} when is_integer(Row) ->
+ execute_cmd('Trace Process', State, [], []);
+
+ %% Click in named GS objects
+ {gs, Cmd, click, Data, Args} when is_atom(Cmd);
+ is_atom(element(1, Cmd)) ->
+ execute_cmd(Cmd, State, Data, Args);
+
+ %% --- Keyboard accelerator commands ---
+
+ %% Move focus up and down
+ {gs, _, keypress, [], ['Up',_,0,0]} ->
+ execute_cmd(focus_previous, State, [], []);
+ {gs, _, keypress, [], ['Down',_,0,0]} ->
+ execute_cmd(focus_next, State, [], []);
+
+ %% Other keyboard shortcuts
+ {gs, _, keypress, [], ['Return',_,0,0]} ->
+ execute_cmd('Trace Process', State, [], []);
+ {gs, _, keypress, [], [Key,_,0,1]} ->
+ execute_cmd(shortcut(Key), State, [], []);
+
+ %% Ignore all other GS events
+ _Other ->
+ State
+ end.
+
+%% Keyboard shortcuts
+
+%% File menu
+shortcut(o) -> 'Default Options';
+shortcut(e) -> 'Exit';
+shortcut(z) -> 'Exit';
+
+%% View menu
+shortcut(i) -> 'Hide All';
+shortcut(u) -> 'Hide Modules';
+shortcut(d) -> 'Hide Selected Process';
+shortcut(m) -> 'Module';
+shortcut(r) -> 'Refresh';
+
+%% Trace menu
+shortcut(k) -> 'Kill';
+shortcut(t) -> 'Trace Process';
+shortcut(s) -> 'Trace Shell';
+
+%% Help menu
+shortcut(h) -> 'Help';
+
+%% Keyboard command only
+shortcut(l) -> 'All Links';
+
+%% Process grid traversal
+shortcut(p) -> focus_previous;
+shortcut(n) -> focus_next;
+shortcut(_) -> dummy.
+
+%% configure([W,H,X,Y|_], State) -> State'
+%% Window has been moved or resized
+configure([W,H|_], State) ->
+ if
+ W==State#state.w, H==State#state.h ->
+ ignore;
+
+ true ->
+ gse:resize(State#state.frame, W, H-?MENU_HEIGHT),
+
+ Grid = State#state.grid,
+ case abs(W - gs:read(Grid,width) - 6) of
+ 0 ->
+ ok; %% Avoid refreshing width if possible
+ _Anything ->
+ Cols = pman_win:calc_columnwidths(W-6),
+ gs:config(Grid, Cols)
+ end,
+ pman_win:configwin(Grid, W, H)
+ end,
+ State.
+
+%% focus(Row, State) -> State'
+%% Row = int() Grid row
+%% User has selected a row in the grid.
+%% Row==1 means header row.
+focus(Row, State) ->
+
+ Pid = case get_pid_in_focus(Row, State#state.grid) of
+ {true, {pidfunc,Pid0,_}} ->
+ pman_win:change_colour(State#state.grid,
+ State#state.focus, Row),
+ enable_pid_actions(),
+ Pid0;
+ false ->
+ disable_pid_actions(),
+ undefined
+ end,
+
+ State#state{focus=Row, focus_pid=Pid}.
+
+%% get_pid_in_focus(Row, Grid) -> {true, Data} | false
+%% Data = {pidfunc, Pid, Func}
+%% Func = {Mod,Name,Arity} | term()
+%% Return the data associated with the process in focus if there is one,
+get_pid_in_focus(1, _Grid) ->
+ false;
+get_pid_in_focus(Row, Grid) ->
+ case gs:read(Grid, {obj_at_row,Row}) of
+ undefined -> false;
+ GridLine ->
+ Data = gs:read(GridLine, data),
+ {true, Data}
+ end.
+
+%% execute_cmd(Cmd, State, Data, Args) -> stop | State'
+
+%% Checkbutton "Hide System Processes"
+execute_cmd('Hide System', State, _Data, Args) ->
+ [_Text, _Group, Bool|_Rest] = Args,
+ State2 = State#state{hide_system=Bool},
+ refresh(State2);
+
+%% Checkbutton "Auto-Hide New"
+execute_cmd('Auto Hide New', State, _Data, Args ) ->
+ [_Text, _Group, Bool|_Rest] = Args,
+ refresh(State#state{hide_new=Bool});
+
+%% File->Options...
+execute_cmd('Default Options', State, _Data, _Args) ->
+ OldOptions = State#state.options,
+ NewOptions = pman_options:dialog(State#state.win,
+ "Default Trace Options",
+ OldOptions),
+ case NewOptions of
+ {error, _Reason} ->
+ State;
+ Options ->
+ State#state{options=Options}
+ end;
+
+%% File->Save Options
+%% Save the set default options to the user's option file
+execute_cmd('Save Options', State, _Data, _Args)->
+ Options = State#state.options,
+ File = options_file(),
+ Parent = State#state.win,
+
+ case pman_options:save_to_file(Options, File) of
+ ok ->
+ tool_utils:notify(Parent, "Options saved to\n" ++ File);
+ {error, ReasonStr} ->
+ Msg = io_lib:format("Could not save options to~n~s:~n~s",
+ [File, ReasonStr]),
+ tool_utils:notify(Parent, Msg)
+ end,
+ State;
+
+%% File->Exit
+%% Exit the application
+execute_cmd('Exit', _State, _Data, _Args) ->
+ stop;
+
+%% View->Hide All Processes
+execute_cmd('Hide All', State, _Data, _Args) ->
+ Node = State#state.node,
+ HideAll = nl_update(Node, true, State#state.hide_all),
+ ShowPids = nl_del_all(State#state.node, State#state.show_pids),
+ State2 = State#state{hide_all=HideAll, show_pids=ShowPids},
+ refresh(State2, true);
+
+%% View->Hide modules...
+%% Opens a dialog where the user can select from a list of
+%% the loaded modules.
+%% The selected module is added to the list of hidden modules.
+execute_cmd('Hide Modules', State, _Data, _Args) ->
+
+ %% Get all loaded modules that are not already hidden
+ AllModules = lists:map(fun({Module, _File}) -> Module end,
+ code:all_loaded()),
+ ModulesSet = ordsets:subtract(ordsets:from_list(AllModules),
+ State#state.hide_modules),
+
+ %% Let the user select which of the loaded modules to exclude from
+ %% the process overview
+ Title = "Module selection",
+ case pman_tool:select(State#state.win, Title, ModulesSet) of
+ Modules when is_list(Modules) ->
+ HideModules = ordsets:union(State#state.hide_modules,
+ ordsets:from_list(Modules)),
+ refresh(State#state{hide_modules=HideModules});
+ cancelled -> State
+ end;
+
+%% View->Hide Selected Process
+%% The process in focus should explicitly be hidden
+execute_cmd('Hide Selected Process', State, _Data, _Args) ->
+ case State#state.focus_pid of
+ undefined -> State;
+ Pid ->
+ Node = State#state.node,
+ HidePids = nl_add(Node, Pid, State#state.hide_pids),
+ ShowPids = nl_del(Node, Pid, State#state.show_pids),
+ refresh(State#state{hide_pids=HidePids, show_pids=ShowPids})
+ end;
+
+%% View->Module Info...
+%% Open window with module information.
+execute_cmd('Module', State, _Data, _Args) ->
+ case get_pid_in_focus(State#state.focus, State#state.grid) of
+ {true, {pidfunc, _Pid, {Module,_Name,_Arity}}} ->
+ pman_module_info:start(Module);
+ _ -> % false | {true, {pidfunc, Pid, Other}}
+ ignore
+ end,
+ State;
+
+%% View->Refresh
+%% Refresh the main window.
+%% (Called automatically every ?REFRESH_TIME millisecond)
+execute_cmd('Refresh', State, _Data, _Args) ->
+ refresh(State);
+
+%% View->Show All Processes
+%% Makes all processes visible except system processes and new
+%% processes, if those buttons are checked.
+%% Note: Also un-hides all hidden modules!
+execute_cmd('Show All', State, _Data, _Args) ->
+ Node = State#state.node,
+ HideAll = nl_update(Node, false, State#state.hide_all),
+ HidePids = nl_del_all(State#state.node, State#state.hide_pids),
+ ShowPids = nl_del_all(State#state.node, State#state.show_pids),
+ State2 = State#state{hide_modules=ordsets:new(), hide_all=HideAll,
+ hide_pids=HidePids, show_pids=ShowPids},
+ refresh(State2, true);
+
+%% View->Show Processes...
+%% Open a list of all hidden processes, if the user selects one this
+%% process should explicitly be shown
+execute_cmd('Show Selected', State, _Data, _Args) ->
+ Node = State#state.node,
+
+ All = pman_process:r_processes(Node),
+ Hidden = case nl_lookup(Node, State#state.hide_all) of
+ true ->
+ All;
+ false ->
+ Shown = nl_lookup(Node, State#state.shown_pids),
+ ordsets:subtract(All, Shown)
+ end,
+
+ %% Selection window
+ Title = "Select Processes to Show",
+ Tuples =
+ lists:map(fun(Pid) ->
+ {M,F,A} = pman_process:function_info(Pid),
+ Str = case pman_process:get_name(Pid) of
+ " " ->
+ io_lib:format("~p:~p/~p",
+ [M, F, A]);
+ Name ->
+ io_lib:format("[~p] ~p:~p/~p",
+ [Name, M, F, A])
+ end,
+ {Pid, Str}
+ end,
+ Hidden),
+ case pman_tool:select(State#state.win, Title, Tuples) of
+ Pids when is_list(Pids) ->
+ HidePids = nl_del(Node, Pids, State#state.hide_pids),
+ ShowPids = nl_add(Node, Pids, State#state.show_pids),
+ refresh(State#state{hide_pids=HidePids,show_pids=ShowPids});
+ cancelled -> State
+ end;
+
+%% Trace->Kill
+execute_cmd('Kill', State, _Data, _Args) ->
+ case State#state.focus_pid of
+ Pid when is_pid(Pid) ->
+ exit(Pid, kill);
+ undefined ->
+ ignore
+ end,
+ State;
+
+%% Trace->Selected Process
+execute_cmd('Trace Process', State, _Data, _Args) ->
+ case State#state.focus_pid of
+ Pid when is_pid(Pid) ->
+ pman_shell:start({Pid,self()}, State#state.options);
+ undefined ->
+ ignore
+ end,
+ State;
+
+%% Trace->Shell Process
+execute_cmd('Trace Shell', State, _Data, _Args) ->
+ case pman_shell:find_shell() of
+ noshell ->
+ State;
+ Shell ->
+ pman_shell:start({{shell,Shell},self()},
+ State#state.options),
+ State#state{noshell=false}
+ end;
+
+%% Nodes->Show <Node>
+%% Change shown node
+execute_cmd({node,Node}, State, _Data, _Args) ->
+ gse:config(State#state.win,
+ [{title,lists:concat(["Pman: Overview on ", Node])}]),
+ gse:disable(Node),
+ catch gse:enable(State#state.node), % Menu may not exist any more
+ refresh(State#state{node=Node}, true);
+
+%% Help->Help
+execute_cmd('Help', State, _Data, _Args) ->
+ Win = State#state.win,
+ HelpFile =
+ filename:join([code:lib_dir(pman),"doc","html","index.html"]),
+ tool_utils:open_help(Win, HelpFile),
+ State;
+
+%% Keyboard shortcut Ctrl-l
+execute_cmd('All Links', State, _Data, _Args) ->
+ case State#state.focus_pid of
+ Pid when is_pid(Pid) ->
+ case process_info(Pid, links) of
+ {links, Pids} ->
+ pman_shell:start_list(Pids, self(),
+ State#state.options);
+ undefined ->
+ ignore
+ end;
+ undefined -> ignore
+ end,
+ State;
+
+%% Keyboard shortcuts for process grid traversal
+execute_cmd(focus_previous, State, _Data, _Args) ->
+ focus(previous_row(State), State);
+execute_cmd(focus_next, State, _Data, _Args) ->
+ focus(next_row(State), State);
+
+%% Keyboard combinations that are not shortcuts
+execute_cmd(dummy, State, _Data, _Args) ->
+ State.
+
+%% Convenience functions for disabling/enabling menu items that require
+%% that a process is selected.
+disable_pid_actions() ->
+ lists:foreach(fun(X) -> gse:disable(X) end, ?REQUIRES_FOCUS).
+
+enable_pid_actions() ->
+ lists:foreach(fun(X) -> gse:enable(X) end, ?REQUIRES_FOCUS).
+
+%% refresh(State) -> State'
+%% refresh(State, ForceP) -> State'
+%% Refreshes the main window.
+refresh(State) ->
+ refresh(State, false).
+refresh(#state{node=Node} = State, ForceP) ->
+
+ %% Update shown processes
+
+ %% First, get an ordset of all processes running at the current node
+ All = pman_process:r_processes(Node),
+
+ Shown = nl_lookup(Node, State#state.shown_pids),
+ ExpShown = nl_lookup(Node, State#state.show_pids),
+
+ {Show, State2} =
+ case nl_lookup(Node, State#state.hide_all) of
+
+ %% If the user has selected "Hide All Processes", only
+ %% explicitly selected processes which still exist should
+ %% be shown
+ true ->
+ {ordsets:intersection(ExpShown, All), State};
+
+ false ->
+ %% Compute which processes should be hidden according
+ %% to the flags/menu items selected
+ Hidden = hidden_pids(All, State),
+
+ NotHidden = ordsets:subtract(All, Hidden),
+
+ Show0 = case State#state.hide_new of
+ %% If the user has selected "Auto-Hide New",
+ %% then only those processes in NotHidden
+ %% which are already shown, should be shown,
+ %% together with explicitly selected
+ %% processes which still exist
+ true ->
+ ordsets:union(
+ ordsets:intersection(NotHidden,Shown),
+ ordsets:intersection(ExpShown, All));
+
+ %% Otherwise, show all processes in
+ %% NotHidden, together with explicitly
+ %% selected processes which still exist
+ false ->
+ ordsets:union(
+ NotHidden,
+ ordsets:intersection(ExpShown, All))
+ end,
+
+ ShownPids = nl_update(Node, Show0,
+ State#state.shown_pids),
+ {Show0, State#state{shown_pids=ShownPids}}
+ end,
+
+ NoOfHidden = length(All) - length(Show),
+
+ if
+ Show==Shown, not ForceP ->
+ pman_win:update(NoOfHidden),
+ State;
+
+ true ->
+ ShowInfo = display_info(Show),
+ pman_win:update(State#state.grid, ShowInfo, NoOfHidden),
+
+ %% Set the focus appropriately
+ State3 = case State2#state.focus_pid of
+ undefined ->
+ disable_pid_actions(),
+ State2;
+ Pid ->
+ Row = get_row(Pid, Show),
+ focus(Row, State2)
+ end,
+
+ trace_shell_possible(State3),
+
+ Size = length(Show),
+ case Size of
+ 1 -> gse:disable('Hide All');
+ _ -> gse:enable('Hide All')
+ end,
+
+ State3#state{size=Size}
+ end.
+
+%% hidden_pids(All, State) -> Hidden
+hidden_pids(All, State) ->
+
+ %% Processes hidden because they are system processes
+ HideSys = case State#state.hide_system of
+ true ->
+ lists:filter(
+ fun(Pid) ->
+ pman_process:is_system_process(Pid)
+ end,
+ All);
+ false ->
+ []
+ end,
+
+ %% Process hidden because they are executing code in a hidden module
+ Mods = State#state.hide_modules,
+ HideMod =
+ lists:filter(fun(Pid) ->
+ pman_process:is_hidden_by_module(Pid, Mods)
+ end,
+ All),
+
+ %% Explicitly hidden processes
+ HideExp = nl_lookup(State#state.node, State#state.hide_pids),
+
+ %% All hidden processes
+ ordsets:union([HideSys, HideMod, HideExp]).
+
+display_info(Pids) ->
+ lists:map(fun(Pid) ->
+ Func = pman_process:function_info(Pid),
+ Name = pman_process:get_name(Pid),
+ Msgs = pman_process:msg(Pid),
+ Reds = pman_process:reds(Pid),
+ Size = pman_process:psize(Pid),
+ {Pid, Func, Name, Msgs, Reds, Size}
+ end,
+ Pids).
+
+get_row(Pid, List) ->
+ get_row(Pid, List, length(List)+1).
+
+get_row(Pid, [Pid | _], Row) ->
+ Row;
+get_row(Pid, [_ | T], Row) ->
+ get_row(Pid, T, Row-1);
+get_row(_Pid, [], _Row) ->
+ 1.
+
+next_row(#state{size=Size, focus=Row}) ->
+ check_row(Row+1, Size).
+
+previous_row(#state{size=Size, focus=Row}) ->
+ check_row(Row-1, Size).
+
+check_row(1, Size) ->
+ Size+1;
+check_row(Row, Size) when Row==Size+2 ->
+ 2;
+check_row(Row, _Size) ->
+ Row.
+
+%% Check if node is running in noshell mode and if so disable the
+%% 'Trace Shell' menu option.
+trace_shell_possible(#state{noshell=true}) ->
+ gse:disable('Trace Shell');
+trace_shell_possible(_) ->
+ ok.
+
+%% -- Functions for manipulating {Node, Data} lists --
+
+%% nl_add(Node, Elem|Elems, NList) -> NList'
+nl_add(Node, Elems, [{Node, Ordset} | T]) when is_list(Elems) ->
+ [{Node, ordsets:union(Elems, Ordset)} | T];
+nl_add(Node, Elem, [{Node, Ordset} | T]) ->
+ [{Node, ordsets:add_element(Elem, Ordset)} | T];
+nl_add(Node, Elem, [H | T]) ->
+ [H | nl_add(Node, Elem, T)];
+nl_add(Node, Elems, []) when is_list(Elems) ->
+ [{Node, Elems}];
+nl_add(Node, Elem, []) ->
+ [{Node, ordsets:add_element(Elem, ordsets:new())}].
+
+%% nl_del(Node, Elem|Elems, NList) -> NList'
+nl_del(Node, Elems, [{Node, Ordset} | T]) when is_list(Elems) ->
+ [{Node, ordsets:subtract(Ordset, Elems)} | T];
+nl_del(Node, Elem, [{Node, Ordset} | T]) ->
+ [{Node, ordsets:del_element(Elem, Ordset)} | T];
+nl_del(Node, Elem, [H | T]) ->
+ [H | nl_del(Node, Elem, T)];
+nl_del(_Node, _Elem, []) ->
+ [].
+
+%% nl_del_all(Node, NList) -> NList'
+nl_del_all(Node, [{Node, _Ordset} | T]) ->
+ [{Node, ordsets:new()} | T];
+nl_del_all(Node, [H | T]) ->
+ [H | nl_del_all(Node, T)];
+nl_del_all(_Node, []) ->
+ [].
+
+%% nl_update(Node, Val, NList) -> NList'
+nl_update(Node, Val, [{Node, _OldVal} | T]) ->
+ [{Node, Val} | T];
+nl_update(Node, Val, [H | T]) ->
+ [H | nl_update(Node, Val, T)];
+nl_update(Node, Val, []) ->
+ [{Node, Val}].
+
+%% nl_lookup(Node, NList) -> Val
+nl_lookup(Node, NList) ->
+ {value, {_Node,Val}} = lists:keysearch(Node, 1, NList),
+ Val.
+
+%% nl_exists(Node, NList) -> bool()
+nl_exists(Node, NList) ->
+ case lists:keysearch(Node, 1, NList) of
+ {value, _Val} ->
+ true;
+ false ->
+ false
+ end.
diff --git a/lib/pman/src/pman_module_info.erl b/lib/pman/src/pman_module_info.erl
new file mode 100644
index 0000000000..cfd711a6e1
--- /dev/null
+++ b/lib/pman/src/pman_module_info.erl
@@ -0,0 +1,131 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(pman_module_info).
+
+%% Window with module information (View->Module Info...)
+
+%% External exports
+-export([start/1]).
+
+%% Record for keeping the loop state for the
+%% module info process.
+-record(state, {topwin, % GS identifier for top window
+ editor, % GS identifier for editor
+ module, % Name of the viewed module
+ parent}). % Pid of the parent
+
+start(Module) ->
+ Self = self(),
+ spawn_link(fun() -> init(Module, Self) end).
+
+init(Module, Parent) ->
+ process_flag(trap_exit, true),
+
+ GS = gs:start([{kernel,true}]),
+ Font = pman_win:font(GS),
+
+ WinTitle = lists:flatten(io_lib:format("Pman - Module Info: ~p",
+ [Module])),
+ WinOptions = [{title,WinTitle}, {width,550}, {height, 400},
+ {configure,true}, {keypress,true}, {destroy,true}],
+ TopWindow = gse:window(GS, WinOptions),
+
+ %% File menu
+ MenuBar = gse:menubar(TopWindow, []),
+ MBFile = gse:menubutton(MenuBar, [{label,{text," File "}},
+ {font,Font}, {underline, 1}]),
+ MenuFile = gse:menu(MBFile, []),
+
+ gse:named_menuitem('Save buffer', MenuFile,
+ [{label,{text,"Save buffer..."}},
+ {font,Font}, {underline,0}]),
+ gse:named_menuitem('Close', MenuFile,
+ [{label,{text,"Close"}},
+ {font,Font}, {underline,0}]),
+
+ %% Output part of window
+ Editor = gse:editor(TopWindow,
+ [{font,Font},
+ {x,3}, {y,40}, {width,546}, {height,348}]),
+ gse:config(Editor, [{keypress,true},
+ {insert,{'end',pman_win:module_data(Module)}}]),
+ gse:config(Editor, [{enable,false},
+ {vscroll,right}, {hscroll,bottom},
+ {wrap,none}]),
+ gse:map(TopWindow),
+
+ State = #state{topwin=TopWindow, editor=Editor, module=Module,
+ parent=Parent},
+ loop(State).
+
+loop(State) ->
+
+ receive
+ %% Die if the parent dies
+ {'EXIT', Pid, _Reason} when Pid==State#state.parent ->
+ gse:destroy(State#state.topwin);
+
+ %% Ignore other exit signals (from file dialog window)
+ {'EXIT', _Pid, _Reason} ->
+ loop(State);
+
+ %% Window closed
+ {gs, _TopWindow, destroy, [], []} ->
+ ok;
+
+ %% Window resized or moved
+ {gs, _TopWindow, configure ,_Data, [W,H,_X,_Y|_]} ->
+ gs:config(State#state.editor, [{width,W-3}, {height,H-40}]),
+ loop(State);
+
+ %% Close - destroy window and exit process
+ {gs, 'Close', click, _Data, _Args} ->
+ gse:destroy(State#state.topwin),
+ ok;
+
+ %% Save Buffer - make filename and save buffer to file
+ {gs, 'Save buffer', click, _Data, _Args} ->
+ save_buffer(State),
+ loop(State);
+
+ %% Keyboard accelerator commands
+ {gs, _, keypress, [], [c,_,0,1]} -> % 'Close'
+ gse:destroy(State#state.topwin),
+ ok;
+ {gs, _, keypress, [], [s,_,0,1]} -> % 'Save buffer'
+ save_buffer(State),
+ loop(State);
+ {gs, _, keypress, _Data, _Args} ->
+ loop(State)
+ end.
+
+save_buffer(State) ->
+ DefaultFile = atom_to_list(State#state.module) ++ ".module_info",
+ Result = tool_utils:file_dialog([{type,save}, {file,DefaultFile}]),
+ case Result of
+ %% User selected a file, now save the result
+ {ok, File, _Dir} ->
+ gs:config(State#state.editor, {save,File}),
+ Msg = "Module information saved in file\n" ++ File,
+ tool_utils:notify(State#state.topwin, Msg);
+
+ %% File dialog was cancelled in some way.
+ {error, _Reason} ->
+ ignore
+ end.
diff --git a/lib/pman/src/pman_options.erl b/lib/pman/src/pman_options.erl
new file mode 100644
index 0000000000..0765458fdc
--- /dev/null
+++ b/lib/pman/src/pman_options.erl
@@ -0,0 +1,395 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(pman_options).
+
+%% Window with trace options settings (File->Options...)
+
+-export([dialog/3,
+ read_from_file/1, save_to_file/2]).
+
+-include("pman_options.hrl").
+
+-define(WIN_WIDTH, 350).
+-define(WIN_HEIGHT, 350).
+
+-define(TOP_WINDOW, xx_pman_option_window_xx).
+-define(TOP_FRAME, xx_pman_top_frame_xx).
+
+-record(state, {resize_frame, % GS identifier for the main frame
+ parent}). % Pid of parent
+
+%%--dialog/3------------------------------------------------------------
+%% Create a window, or return a value indicating that is is already
+%% created.
+
+dialog(ParentWin, Title, Options) ->
+ Self = self(),
+ Pid = spawn(fun() -> dialog(Self, ParentWin, Title, Options) end),
+ receive
+ {Pid, Value} ->
+ Value % Options2 | {error,destroyed} | {error,cancelled}
+ end.
+
+dialog(Parent, ParentWin, Title, Options) ->
+
+ %% Check if the dialog has already been created, in that
+ %% case, we can reuse it. Otherwise a new dialog is created.
+ case gse:name_occupied(?TOP_WINDOW) of
+ false -> make_window(ParentWin, Title);
+ true -> ok
+ end,
+
+ %% Window has now been created or may be re-used
+ update_window_from_options(Options),
+
+ gse:resize(?TOP_FRAME, ?WIN_WIDTH, ?WIN_HEIGHT),
+ gse:map(?TOP_WINDOW),
+
+ loop(#state{resize_frame=?TOP_FRAME, parent=Parent}).
+
+loop(State) ->
+ receive
+ {gs, _Id, destroy, _Data, _Arg} ->
+ State#state.parent ! {self(), {error,destroyed}};
+
+ {gs, ?TOP_WINDOW, configure, _Data, [W, H |_]} ->
+ gse:config(State#state.resize_frame,
+ [{width,W},{height,H}]), % repack
+ loop(State);
+
+ {gs, ok_button, click, _Data, _Arg} ->
+ Options = get_options_from_window(),
+ gse:unmap(?TOP_WINDOW),
+ State#state.parent ! {self(), Options};
+
+ {gs, cancel_button, click, _Data, _Arg} ->
+ gse:unmap(?TOP_WINDOW),
+ State#state.parent ! {self(), {error,cancelled}};
+
+ {gs, trace_spawn, click, _Data, [_Text,_,Value]} ->
+ group_radio(Value, trace_spawn_all, [trace_spawn_all,
+ trace_spawn_first]),
+ loop(State);
+
+ {gs, trace_link, click, _Data, [_Text,_,Value]} ->
+ group_radio(Value, trace_link_all, [trace_link_all,
+ trace_link_first]),
+ loop(State);
+
+ {gs, trace_in_window, click, _Data, _Arg} ->
+ lists:foreach(fun(X) -> gse:disable(X) end,
+ [trace_file, trace_file_browse]),
+ loop(State);
+
+ {gs, trace_to_file, click, _Data, [_Text,_,_Value]} ->
+ lists:foreach(fun(X) -> gse:enable(X) end,
+ [trace_file, trace_file_browse]),
+ loop(State);
+
+ {gs, trace_file_browse, click, _Data, _Arg} ->
+ Result = tool_utils:file_dialog([{type,save},
+ {file, "Untitled.log"}]),
+ case Result of
+ {error, _Reason} ->
+ loop(State);
+ {ok, Name,_State} ->
+ gse:config(trace_file, [{text, Name}]),
+ loop(State)
+ end
+ end.
+
+-define(LBLOPTS, [{justify,left}, {align,w}]).
+-define(BTNOPTS, [{justify,left}, {align,w}]).
+
+make_window(ParentWin, Title) ->
+
+ Font = pman_win:font(),
+
+ gse:named_window(?TOP_WINDOW, ParentWin, [{title,Title},
+ {configure,true},
+ {width, ?WIN_WIDTH},
+ {height, ?WIN_HEIGHT}]),
+
+ gse:named_frame(?TOP_FRAME, ?TOP_WINDOW,
+ [{bw,3},
+ {packer_x,[{stretch,1,175}, {stretch,1,175}]},
+ {packer_y,[{stretch,3},{stretch,2},{stretch,1}]}]),
+
+ F11 = gse:frame(?TOP_FRAME, [{bw,3},
+ {pack_xy,{1,1}},
+ {packer_x,[{stretch,1},
+ {stretch,20},
+ {stretch,2}]},
+ {packer_y,[{stretch,2},
+ {stretch,1},
+ {stretch,1},
+ {stretch,1},
+ {stretch,1},
+ {stretch,1},
+ {stretch,1},
+ {stretch,1}]}]),
+
+ gse:label(F11,[{pack_xy,{2,1}},
+ {label,{text,"Trace output options:"}},
+ {font,Font} | ?LBLOPTS]),
+
+ gse:named_checkbutton(trace_send, F11,
+ [{pack_xy,{2,2}},
+ {label,{text,"Trace send"}},
+ {font,Font} | ?BTNOPTS]),
+ gse:named_checkbutton(trace_receive, F11,
+ [{pack_xy,{2,3}},
+ {label,{text, "Trace receive"}},
+ {font,Font} | ?BTNOPTS]),
+ gse:named_checkbutton(trace_functions,F11,
+ [{pack_xy,{2,4}},
+ {label,{text, "Trace functions"}},
+ {font,Font} | ?BTNOPTS]),
+ gse:named_checkbutton(trace_events,F11,
+ [{pack_xy,{2,5}},
+ {label,{text, "Trace events"}},
+ {font,Font} | ?BTNOPTS]),
+
+ F21 = gse:frame(?TOP_FRAME, [{bw,3},
+ {pack_xy,{2,1}},
+ {packer_x,[{stretch,1},
+ {stretch,2},
+ {stretch,2},
+ {stretch,20},
+ {stretch,1}]},
+ {packer_y,[{stretch,2},
+ {stretch,1},
+ {stretch,1},
+ {stretch,1},
+ {stretch,1},
+ {stretch,1},
+ {stretch,1},
+ {stretch,1},
+ {stretch,1}]}]),
+
+ gse:label(F21, [{pack_xy,{{2,4},1}},
+ {label,{text,"Inheritance options:"}},
+ {font,Font} | ?LBLOPTS]),
+
+ gse:named_checkbutton(trace_spawn, F21,
+ [{pack_xy,{{2,4},2}},
+ {data,trace_send},
+ {label,{text,"Inherit on spawn"}},
+ {font,Font} | ?BTNOPTS]),
+ gse:named_radiobutton(trace_spawn_all, F21,
+ [{pack_xy,{{3,4},3}},
+ {group,spawn},
+ {data,trace_receive},
+ {label,{text, "All spawns"}},
+ {font,Font} | ?BTNOPTS]),
+ gse:named_radiobutton(trace_spawn_first, F21,
+ [{pack_xy,{{3,4},4}},
+ {group,spawn},
+ {data,trace_receive},
+ {label,{text,"First spawn only"}},
+ {font,Font} | ?BTNOPTS]),
+ gse:named_checkbutton(trace_link, F21,
+ [{pack_xy,{{2,4},6}},
+ {data,trace_send},
+ {label,{text,"Inherit on link"}},
+ {font,Font} | ?BTNOPTS]),
+ gse:named_radiobutton(trace_link_all, F21,
+ [{pack_xy,{{3,4},7}},
+ {group,link},
+ {data,trace_receive},
+ {label,{text,"All links"}},
+ {font,Font} | ?BTNOPTS]),
+
+ gse:named_radiobutton(trace_link_first, F21,
+ [{pack_xy,{{3,4},8}},
+ {group,link},
+ {data,trace_receive},
+ {label,{text,"First link only"}},
+ {font,Font} | ?BTNOPTS]),
+
+ F12 = gse:frame(?TOP_FRAME, [{bw,3},
+ {pack_xy,{{1,2},2}},
+ {packer_x,[{stretch,1},
+ {stretch,5}, % Label
+ {stretch,1},
+ {stretch,10}, % Field
+ {stretch,1},
+ {stretch,5}, % Button
+ {stretch,1}]},
+ {packer_y,[{stretch,2},
+ {stretch,1},
+ {stretch,1},
+ {stretch,1}]}]),
+
+ gse:label(F12, [{pack_xy,{{2,6},1}},
+ {label,{text,"Trace output options:"}},
+ {font,Font} | ?LBLOPTS]),
+ gse:named_radiobutton(trace_in_window, F12,
+ [{pack_xy,{{2,6},2}},
+ {group, trace_dest},
+ {label,{text,"In window"}},
+ {font,Font} | ?BTNOPTS]),
+ gse:named_radiobutton(trace_to_file, F12,
+ [{pack_xy,{2,3}},
+ {group, trace_dest},
+ {label,{text,"To file"}},
+ {font,Font} | ?BTNOPTS]),
+ gse:named_entry(trace_file, F12, [{pack_xy,{4,3}}, {font,Font}]),
+ gse:named_button(trace_file_browse, F12,
+ [{pack_xy,{6,3}},
+ {label,{text," Browse..."}},
+ {font,Font} | ?BTNOPTS]),
+
+ F13 = gse:frame(?TOP_FRAME, [{bw,3},
+ {pack_xy,{{1,2},3}},
+ {packer_x,[{stretch, 1},
+ {fixed, 60},
+ {stretch, 1},
+ {fixed, 60},
+ {stretch, 1}]},
+ {packer_y,[{stretch,1},
+ {fixed, 30},
+ {stretch,1}]}]),
+
+ gse:named_button(ok_button, F13, [{pack_xy,{2,2}},
+ {label,{text,"OK"}},
+ {font,Font}]),
+ gse:named_button(cancel_button, F13, [{pack_xy,{4,2}},
+ {label,{text,"Cancel"}},
+ {font,Font}]).
+
+update_window_from_options(Options) ->
+
+ %% Trace output
+ gse:config(trace_send, [{select,Options#trace_options.send}]),
+ gse:config(trace_receive,
+ [{select,Options#trace_options.treceive}]),
+ gse:config(trace_functions,
+ [{select,Options#trace_options.functions}]),
+ gse:config(trace_events, [{select,Options#trace_options.events}]),
+
+ %% Trace inheritance
+ case (Options#trace_options.inherit_on_all_spawn or
+ Options#trace_options.inherit_on_1st_spawn) of
+ true ->
+ gse:select(trace_spawn),
+ gse:config(trace_spawn_all,
+ [{select,Options#trace_options.inherit_on_all_spawn}]),
+ gse:config(trace_spawn_first,
+ [{select,Options#trace_options.inherit_on_1st_spawn}]);
+ false ->
+ lists:foreach(fun(X) -> gse:disable(X) end,
+ [trace_spawn_all,trace_spawn_first])
+ end,
+
+ case (Options#trace_options.inherit_on_all_link or
+ Options#trace_options.inherit_on_1st_link) of
+ true -> gse:select(trace_link),
+ gse:config(trace_link_all,
+ [{select,Options#trace_options.inherit_on_all_link}]),
+ gse:config(trace_link_first,
+ [{select, Options#trace_options.inherit_on_1st_link}]);
+ false ->
+ lists:foreach(fun(X) -> gse:disable(X) end,
+ [trace_link_all,trace_link_first])
+ end,
+
+ %% Trace ouput destinations
+ gse:config(trace_in_window,
+ [{select,(not Options#trace_options.to_file)}]),
+
+ gse:config(trace_to_file, [{select,Options#trace_options.to_file}]),
+ gse:config(trace_file, [{text,Options#trace_options.file}]),
+ case Options#trace_options.to_file of
+ true ->
+ ok;
+ false ->
+ lists:foreach(fun(X) -> gse:disable(X) end,
+ [trace_file, trace_file_browse])
+ end.
+
+get_options_from_window() ->
+ #trace_options{send = gse:read(trace_send,select),
+ treceive = gse:read(trace_receive,select),
+ functions = gse:read(trace_functions,select),
+ events = gse:read(trace_events,select),
+ inherit_on_1st_spawn = gse:read(trace_spawn_first,select),
+ inherit_on_all_spawn = gse:read(trace_spawn_all,select),
+ inherit_on_1st_link = gse:read(trace_link_first,select),
+ inherit_on_all_link = gse:read(trace_link_all,select),
+ to_file = gse:read(trace_to_file,select),
+ file = gse:read(trace_file,text)}.
+
+group_radio(Value, Default, GroupList) ->
+ case Value of
+ true ->
+ gse:select(Default),
+ lists:foreach(fun(X) -> gse:enable(X) end, GroupList);
+ false ->
+ lists:foreach(fun(X) -> gse:deselect(X) end, GroupList),
+ lists:foreach(fun(X) -> gse:disable(X) end, GroupList)
+ end.
+
+%%--read_from_file/(File)-----------------------------------------------
+%% Returns the options saved in File.
+%% If no options can be found, then the default options are
+%% returned.
+
+read_from_file(File) ->
+ case file:consult(File) of
+ {ok, [Term]} ->
+ if
+ is_record(Term, trace_options) ->
+ {ok, Term};
+ true ->
+ {error, "unexpected contents", #trace_options{}}
+ end;
+ {ok, _Terms} ->
+ {error, "unexpected contents", #trace_options{}};
+ {error, Tuple} when is_tuple(Tuple) -> % {Line,Mod,Term}
+ {error, "erroneous contents", #trace_options{}};
+ {error, _Posix} ->
+ %% The most probable reason is that the file does not
+ %% exist, this is not an error so we simply return
+ %% the default trace options instead
+ {ok, #trace_options{}}
+ end.
+
+%%--save_to_file(Options, File)-----------------------------------------
+
+save_to_file(Options, File) ->
+ case file:open(File, [write]) of
+ {ok, Fd} ->
+ {{Year,Month,Day},{H,M,S}} = calendar:local_time(),
+ io:format(Fd, "%%%~n", []),
+ io:format(Fd, "%%% File: ~s~n", [File]),
+ io:format(Fd, "%%% Date: ~w-~2..0w-~2..0w, ~2..0w:~2..0w:~2..0w~n",
+ [Year,Month,Day,H,M,S]),
+ io:format(Fd, "%%%~n", []),
+ io:format(Fd, "%%% This file was created by Pman. ~n", []),
+ io:format(Fd, "%%%~n", []),
+ io:format(Fd, "%%% DO NOT EDIT! ~n", []),
+ io:format(Fd, "%%%~n", []),
+ io:format(Fd, "%%%~n", []),
+ io:format(Fd, "~p.~n", [Options]),
+ file:close(Fd),
+ ok;
+ {error, Posix} ->
+ {error, file:format_error(Posix)}
+ end.
diff --git a/lib/pman/src/pman_options.hrl b/lib/pman/src/pman_options.hrl
new file mode 100644
index 0000000000..047b9866c3
--- /dev/null
+++ b/lib/pman/src/pman_options.hrl
@@ -0,0 +1,34 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+
+%%
+%% An options-record contains the return data from the option dialog.
+%%
+
+-record(trace_options, {send=true,
+ treceive=true,
+ functions=true,
+ events=true,
+ to_file=false,
+ file="",
+ inherit_on_1st_spawn=false,
+ inherit_on_all_spawn=true,
+ inherit_on_1st_link=false,
+ inherit_on_all_link=true}).
+
diff --git a/lib/pman/src/pman_process.erl b/lib/pman/src/pman_process.erl
new file mode 100644
index 0000000000..276407a0f1
--- /dev/null
+++ b/lib/pman/src/pman_process.erl
@@ -0,0 +1,317 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+%%----------------------------------------------------------------------
+%% Purpose : A front-end to the erlang:process_info() functions, that
+%% can handle processes on different nodes in a transparent
+%% way.
+%% Also some convenience functions for process info, as well
+%% as some application specific functions for process
+%% classification.
+%%----------------------------------------------------------------------
+
+-module(pman_process).
+
+-export([pinfo/1, pinfo/2,
+ r_processes/1,
+ function_info/1,
+ get_name/1, msg/1, reds/1, psize/1,
+ is_running/1,
+ is_pid_or_shell/1,
+ get_pid/1,
+ is_system_process/1,
+ is_hidden_by_module/2
+ ]).
+
+%% List of registered name that will make a prodcess a "SYSTEM"-process
+-define(SYSTEM_REG_NAMES,
+ [
+ %% kernel
+ application_controller,
+ erl_reply,
+ auth,
+ boot_server,
+ code_server,
+ disk_log_server,
+ disk_log_sup,
+ erl_prim_loader,
+ error_logger,
+ file_server_2,
+ fixtable_server,
+ global_group,
+ global_name_server,
+ heart,
+ inet_gethost_native,
+ inet_gethost_native_sup,
+ init,
+ kernel_config,
+ kernel_safe_sup,
+ kernel_sup,
+ net_kernel,
+ net_sup,
+ rex,
+ user,
+ os_server,
+ ddll_server,
+ erl_epmd,
+ inet_db,
+ pg2,
+
+ %% stdlib
+ timer_server,
+ rsh_starter,
+ take_over_monitor,
+ pool_master,
+ dets,
+
+ %% sasl
+ sasl_safe_sup, sasl_sup, alarm_handler, overload,
+ release_handler,
+
+ %% gs
+ gs_frontend
+ ]).
+
+%% List of module:function/arity calls that will make the caller a
+%% "SYSTEM"-process.
+%%
+-define(SYSTEM_INIT_CALLS,
+ [{application_master,init,4},
+ {application_master,start_it,4},
+ {inet_tcp_dist,accept_loop,2},
+ {net_kernel,ticker,2},
+ {supervisor_bridge,user_sup,1},
+ {user_drv,server,2},
+ {group,server,3},
+ {kernel_config,init,1},
+ {inet_tcp_dist,do_accept,6},
+ {inet_tcp_dist,do_setup,6},
+ {pman_main,init,2},
+ {pman_buf_printer,init,2},
+ {pman_buf_converter,init,2},
+ {pman_buf_buffer,init,1},
+ {gstk,init,1},
+ {gstk_port_handler,init,2},
+ {gstk,worker_init,1}
+ ]).
+
+%% List of module:function/arity calls that will make the executing
+%% process a "SYSTEM"-process.
+-define(SYSTEM_RUNNING_CALLS,
+ [{file_io_server,server_loop,1},
+ {global,loop_the_locker,1},
+ {global,collect_deletions,2},
+ {global,loop_the_registrar,0},
+ {gs_frontend,request,2},
+ {shell,get_command1,5},
+ {shell,eval_loop,3},
+ {io,wait_io_mon_reply,2},
+ {pman_module_info,loop,1},
+ {pman_options,dialog,3},
+ {pman_options,loop,1},
+ {pman_relay_server,loop,1},
+ {pman_shell,monitor_loop,1},
+ {pman_shell,safe_loop,2}
+ ]).
+
+%% pinfo(Pid) -> [{Item, Info}] | undefined
+%% pinfo(Pid, Item) -> Info | undefined
+%% A version of process_info/1 that handles pid on remote nodes as well.
+pinfo({_, Pid}) -> % Handle internal process format
+ pinfo(Pid);
+pinfo(Pid) when node(Pid)==node() ->
+ process_info(Pid);
+pinfo(Pid) ->
+ case rpc:call(node(Pid), erlang, process_info, [Pid]) of
+ {badrpc, _} -> undefined;
+ Res -> Res
+ end.
+
+pinfo({_, Pid}, Item) -> % Handle internal process format
+ pinfo(Pid, Item);
+pinfo(Pid, Item) when node(Pid)==node() ->
+ case process_info(Pid, Item) of
+ {Item, Info} -> Info;
+ "" -> ""; % Item == registered_name
+ undefined -> undefined
+ end;
+pinfo(Pid, Item) ->
+ case rpc:call(node(Pid), erlang, process_info, [Pid, Item]) of
+ {badrpc, _} -> undefined;
+ {Item, Info} -> Info;
+ "" -> ""; % Item == registered_name
+ undefined -> undefined
+ end.
+
+%% function_info(Pid) -> {M, F, A}
+%% Returns the initial function for the specified process.
+function_info(Pid) ->
+ case pinfo(Pid, current_function) of
+ {Module, Function, Arity} ->
+ {Module, Function, Arity};
+ undefined ->
+ {unknown, unknown, 0}
+ end.
+
+%% r_processes(Node) -> Pids
+%% Return a list of all processes at Node.
+%%
+%% If there is a problem with getting information from a remote
+%% node, an empty list is returned.
+r_processes(Node) ->
+ ordsets:from_list(r_processes1(Node)).
+
+r_processes1(Node) ->
+ if
+ Node==node() ->
+ processes();
+ true ->
+ case rpc:block_call(Node, erlang, processes, []) of
+ {badrpc, _} ->
+ [];
+ Pids -> Pids
+ end
+ end.
+
+%% is_running(Object) -> {true, {shell,Pid}} | {true, Pid} | false
+%% Object = {shell, Pid} | {link, Pid, ?} | Pid
+is_running({shell,Pid}) ->
+ case is_running(Pid) of
+ {true,Pid} ->
+ {true,{shell,Pid}};
+ false ->
+ false
+ end;
+is_running({link,Pid,_}) ->
+ is_running(Pid);
+is_running(Pid) ->
+ case is_pid_or_shell(Pid) of
+ true ->
+ case pinfo(Pid) of
+ undefined -> false;
+ _PInfo -> {true, Pid}
+ end;
+ false ->
+ false
+ end.
+
+%% is_pid_or_shell(Object) -> bool()
+%% Checks if the argument is an pid or a tuple {shell, Pid}.
+is_pid_or_shell({shell,Pid}) when is_pid(Pid) ->
+ true;
+is_pid_or_shell(Pid) when is_pid(Pid) ->
+ true;
+is_pid_or_shell(_) ->
+ false.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% get_pid/1 - returns the Pid of the object provided that
+%% it is a proper process specifier.
+%%
+%% Arguments:
+%% Object A process specifier
+%%
+%% Returns:
+%% The Pid.
+
+get_pid({shell,Pid}) ->
+ Pid;
+get_pid(Pid) when is_pid(Pid) ->
+ Pid.
+
+%% is_system_process(Pid) -> bool()
+%% Returns true if Pid is a "system process".
+%% This is a prototype version, use file configuration later.
+is_system_process(Pid) ->
+ catch is_system_process2(Pid).
+
+is_system_process2(Pid) ->
+
+ %% Test if the registered name is a system registered name
+ case pinfo(Pid, registered_name) of
+ undefined -> ignore;
+ "" -> ignore;
+ Name ->
+ case lists:member(Name, ?SYSTEM_REG_NAMES) of
+ true -> throw(true);
+ false -> ignore
+ end
+ end,
+
+ %% Test if the start specification is a "system start function"
+ MFAi = case pinfo(Pid, initial_call) of
+ {proc_lib, init_p, 5} ->
+ proc_lib:translate_initial_call(Pid); % {M,F,A} | Fun
+ Res -> Res % {M,F,A} | undefined
+ end,
+ case lists:member(MFAi, ?SYSTEM_INIT_CALLS) of
+ true -> throw(true);
+ false -> ignore
+ end,
+
+ %% Test if the running specification is a "system running function"
+ case pinfo(Pid, current_function) of
+ undefined -> false;
+ MFAc ->
+ lists:member(MFAc, ?SYSTEM_RUNNING_CALLS)
+ end.
+
+%% is_hidden_by_module(Pid, Modules) -> bool()
+%% Checks if Pid is to be hidden because it executes code from one
+%% of Modules
+is_hidden_by_module(Pid, Modules) ->
+ case pinfo(Pid, current_function) of
+ {Module, _Function, _Arity} ->
+ lists:member(Module, Modules);
+ undefined -> false
+ end.
+
+%% get_name(Pid) -> Name | " "
+%% Returns the registered name of a process, if any, or " " otherwise.
+get_name(Pid) ->
+ case pinfo(Pid, registered_name) of
+ undefined -> " ";
+ "" -> " ";
+ Name -> Name
+ end.
+
+%% msg(Pid) -> int()
+msg(Pid) ->
+ case pinfo(Pid, messages) of
+ undefined -> 0;
+ Msgs -> length(Msgs)
+ end.
+
+%% reds(Pid) -> int()
+reds(Pid) ->
+ case pinfo(Pid, reductions) of
+ undefined -> 0;
+ Reds -> Reds
+ end.
+
+%% psize(Pid) -> int()
+%% Returns the total process size (stack + heap).
+psize(Pid) ->
+ Stack = pinfo(Pid, stack_size),
+ Heap = pinfo(Pid, heap_size),
+ case {Heap, Stack} of
+ {undefined, undefined} -> 0;
+ {undefined, Sz} -> Sz;
+ {Sz, undefined} -> Sz;
+ {Sz0, Sz1} -> Sz0 + Sz1
+ end.
diff --git a/lib/pman/src/pman_relay.erl b/lib/pman/src/pman_relay.erl
new file mode 100644
index 0000000000..289765492f
--- /dev/null
+++ b/lib/pman/src/pman_relay.erl
@@ -0,0 +1,127 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+%%----------------------------------------------------------------------
+%% Purpose : Interface function to relay calls (esp. trace calls)
+%% to processes on other nodes. Some of the calls
+%% are conditionally relayed.
+%%----------------------------------------------------------------------
+
+-module(pman_relay).
+
+%%-compile(export_all).
+-export([start/1,
+ ok_to_trace/1,
+ trac/3]).
+
+
+-include("assert.hrl").
+
+%% --------------------------------------------------------------
+%% DISTRIBUTION
+%% --------------------------------------------------------------
+%% (???) Process dictionary alert!!!
+%%
+%% Since we are not allowed to do erlang:trace/3 on remote
+%% processe we create a help process at the remote node to
+%% do the job for us
+%% ---------------------------------------------------------------
+
+start(P) when is_pid(P), node(P)/=node() ->
+
+ %% Remote supervision, relaying necessary
+
+ put(relay, spawn_link(node(P), pman_relay_server, init, [self()]));
+
+
+start(_) ->
+
+ %% Local supervision, no relaying
+
+ ignore.
+
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% ok_to_trace/1 - Tests wheter we can actually start tracing
+%% a process.
+%%
+%% Arguments:
+%% Pid Pid of the process to trace (on local or remote node)
+%%
+%% Returns
+%% true If it is OK to trace the process
+%% false If the process is already traced, or some other
+%% condition prevents it from being traced.
+
+ok_to_trace(Pid) when node(Pid) == node()->
+
+ %% Local trace, no relaying
+
+ case catch erlang:trace(Pid, false, [send]) of
+ 1 ->
+ true;
+ _Otherwise ->
+ false
+ end;
+ok_to_trace(Pid) ->
+
+ %% Remote trace, relaying necessary
+
+ PidRelay = get(relay),
+ PidRelay ! {ok_to_trace, self(), Pid},
+ receive
+ {ok_to_trace, PidRelay} ->
+ true;
+ {not_ok_to_trace, PidRelay} ->
+ false;
+ _Otherwise ->
+ ?ALWAYS_ASSERT("Unexpected message from relay process")
+ after
+ 5000 ->
+ false
+ end.
+
+
+
+
+
+
+%% ---------------------------------------------------------------
+%% Possibly send a request to do tracing to a remote node.
+%% ---------------------------------------------------------------
+
+trac(Pid, How, Flag) when node(Pid) == node() ->
+
+ %% Local trace, no relaying necessary
+
+
+ case catch erlang:trace(Pid, How, Flag) of
+ 1 -> ok;
+ _ -> pman_win:format("** Illegal trace request ** \n", [])
+ end;
+
+trac(Pid, How, Flag) ->
+
+
+
+ %% Remote trace, relaying necessary
+
+ get(relay) ! {self(), erlang, trace, [Pid, How, Flag]}.
+
diff --git a/lib/pman/src/pman_relay_server.erl b/lib/pman/src/pman_relay_server.erl
new file mode 100644
index 0000000000..2fcbb663bc
--- /dev/null
+++ b/lib/pman/src/pman_relay_server.erl
@@ -0,0 +1,57 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+%%%----------------------------------------------------------------------
+%%% Purpose : Relay server code.
+%%%----------------------------------------------------------------------
+
+-module(pman_relay_server).
+
+%%-compile(export_all).
+-export([init/1]).
+
+
+
+init(P) ->
+ process_flag(trap_exit, true),
+
+ loop(P).
+
+loop(P) ->
+ receive
+ {ok_to_trace, PidSender, PidToTrace} ->
+ case catch erlang:trace(PidToTrace, false, [send]) of
+ 1 ->
+ PidSender ! {ok_to_trace, self()},
+ loop(P);
+ _Otherwise ->
+ PidSender ! {not_ok_to_trace, self()}
+ end;
+
+ {P, M,F,A} ->
+ case catch apply(M, F, A) of
+ 1 -> ok;
+ _Other -> P ! {print, "** Illegal trace request **\n", []}
+ end,
+ loop(P);
+ {'EXIT', P, _Reason} ->
+ exit(normal);
+ Other -> %% Here is the normal case for trace i/o
+ P ! Other,
+ loop(P)
+ end.
diff --git a/lib/pman/src/pman_shell.erl b/lib/pman/src/pman_shell.erl
new file mode 100644
index 0000000000..0b13890460
--- /dev/null
+++ b/lib/pman/src/pman_shell.erl
@@ -0,0 +1,823 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1996-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+%%
+%% ---------------------------------------------------------------
+%% Purpose: Create a trace window with process
+%% information or a help window with information
+%% about pman.
+%%
+%% ---------------------------------------------------------------
+
+-module(pman_shell).
+
+%% ---------------------------------------------------------------
+%% The user interface exports
+%% ---------------------------------------------------------------
+
+-export([start_list/3,
+ start/2,
+ start/1,
+ find_shell/0]).
+
+%% ---------------------------------------------------------------
+%% Includes
+%% ---------------------------------------------------------------
+-include("assert.hrl").
+-include("pman_options.hrl").
+-include("pman_buf.hrl").
+
+
+%% ---------------------------------------------------------------
+%% Internal record declarations
+%% ---------------------------------------------------------------
+-record(pman_shell,{win,
+ editor,
+ pid,
+ buffer,
+ father,
+ shell_flag, % boolean, true for shell
+ trace_options, % Keeps trace options
+ db}). % DB for trace windows
+
+
+%%
+%% Constants
+%%
+
+-define (PMAN_DB, pman_db). % The pman db for trace windows
+
+
+
+%% ---------------------------------------------------------------
+%% start/1, start/2
+%%
+%% Starts a new trace shell process.
+%%
+%% start(Pid, DefaultOptions)
+%% Pid The Pid of the process to trace
+%% DefaultOptions The default trace options passed along from
+%% the calling process.
+%%
+%%
+%% start(Pid)
+%% Pid The Pid of the process to trace
+%%
+%% start(Pid) starts without using any default options except for those
+%% hardwired into the application. (See pman_options.hrl).
+%%
+%%
+%% Return: Both functions return a process id
+%% ---------------------------------------------------------------
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% start_list/3 - Starts a trace window for each of the processes
+%% in the list
+
+start_list(LIPid, Father, Options) ->
+ StartFun = fun(Pid) ->
+ start({Pid,Father}, Options)
+ end,
+ lists:foreach(StartFun, LIPid).
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% start/1 - Starts a trace window for the specified Pid.
+%%
+
+start(Pid) ->
+ start(Pid, #trace_options{}).
+
+%%
+%% start/2
+%%
+
+start(Pid,DefaultOptions) when is_pid(Pid) ->
+ start({Pid,self()}, DefaultOptions);
+
+start(Var,DefaultOptions) ->
+ Db = db_start(),
+ spawn_link(fun() -> internal(Var, DefaultOptions, Db) end).
+
+%% ---------------------------------------------------------------
+%% Initialize the enviroment for tracing/viewing Object
+%%
+%% Object can either be {shell,Shell} or a Pid.
+%% The main loop is then called, which handles trace and event
+%% requests. The window dies whenever Supervisor dies, while
+%% message windows die whenever their parent dies.
+%% ---------------------------------------------------------------
+
+internal({Object,Supervisor}, DefaultOptions, Db) ->
+
+ %% (???) This call will cause minor problems when the window has been
+ %% invoked with proc/1 from for instance the shell. The shell
+ %% does not handle the exit-signals, so it will exit
+ %% when the window is exited.
+
+
+ %% First check that no other process is tracing the process we want
+ %% to trace. There is no well defined way of doing this, so the
+ %% code below is used instead. (???)
+
+ pman_relay:start(Object), %(???) Uses proc. dict.
+
+ Pid = pman_process:get_pid(Object),
+
+ case pman_relay:ok_to_trace(Pid) of
+
+ %% Tracing cannot be performed on the specified process
+
+ false ->
+ T = lists:flatten(io_lib:format("ERROR: Process ~p is already being~ntraced by some other process.~nOr there may be a problem communicating with it.",[Pid])),
+ tool_utils:notify(gs:start(),T),
+ exit(quit);
+
+ %% Tracing can be performed, go ahead!
+
+ true ->
+
+ case db_insert_key (Db, Pid) of
+ true ->
+
+ link(Supervisor),
+ process_flag(trap_exit, true),
+
+ case catch pman_win:window(Object) of
+ {'EXIT', badrpc} ->
+ T = "ERROR: Could not access node",
+ pman_win:dialog_window(gs:start(),T);
+ {'EXIT', dead} ->
+ T = "ERROR: The process is dead",
+ pman_win:dialog_window(gs:start(),T);
+ {'EXIT',_W} ->
+ T = "ERROR: Untracable process \n(unexpected EXIT reason)",
+ pman_win:dialog_window(gs:start(),T);
+ {Win, Ed} ->
+ init_monitor_loop(Win,
+ Ed,
+ Object,
+ Supervisor,
+ DefaultOptions,
+ Db)
+ end;
+
+ false ->
+ T = lists:flatten(io_lib:format("ERROR: Process ~p is already being~ntraced by some other process.",[Pid])),
+ tool_utils:notify(gs:start(),T),
+ exit(quit);
+
+ Error ->
+ Error
+ end
+
+ end.
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% init_monitor_loop/5
+
+init_monitor_loop(Win,Ed,Object,Supervisor, DefaultOptions, Db) ->
+
+ process_flag(priority, max),
+
+ %% Most default options come from the main window. Now we must set
+ %% the default file name to something that is shows what process
+ %% is being traced.
+
+ %% Find out an appropriate file name to write the trace output
+ %% to if the output should go to a file.
+
+ FileName = case pman_process:is_pid_or_shell(Object) of
+ true ->
+ default_file_name(pman_process:get_pid(Object));
+ false ->
+ "NoName"
+ end,
+
+ Buff = pman_buf:start(Ed, FileName),
+
+ case pman_process:is_running(Object) of
+
+ %% We are tracing a shell process.
+ {true,{shell,Pid}} ->
+ safe_link(Pid),
+ NewDefaultOptions =
+ DefaultOptions#trace_options{file=FileName},
+ perform_option_changes(Pid, NewDefaultOptions, Buff),
+ monitor_loop(#pman_shell{win=Win, editor=Ed, pid=Pid, buffer=Buff,
+ father = Supervisor,
+ shell_flag = true,
+ trace_options = NewDefaultOptions,
+ db = Db});
+
+ %% We are tracing an ordinary process.
+ {true,Pid} ->
+ safe_link(Pid),
+ NewDefaultOptions =
+ DefaultOptions#trace_options{file=FileName},
+ perform_option_changes(Pid, NewDefaultOptions, Buff),
+ monitor_loop(#pman_shell{win=Win, editor=Ed, pid=Pid, buffer=Buff,
+ father = Supervisor,
+ shell_flag = false,
+ trace_options = NewDefaultOptions,
+ db = Db});
+
+ %% The process being traced is dead.
+ false ->
+ monitor_loop(#pman_shell{win=Win, editor=Ed, pid=nopid,
+ buffer=Buff,
+ father = Supervisor,
+ shell_flag = false,
+ trace_options= DefaultOptions,
+ db = Db})
+ end.
+
+%% ----------------------------------------------------------------
+%% What is the Pid of the shell on our node?
+%% ----------------------------------------------------------------
+
+find_shell() ->
+ case shell:whereis_evaluator() of
+ undefined -> % noshell
+ noshell;
+ Pid ->
+ Pid
+ end.
+
+%% ---------------------------------------------------------------
+%% Functions called in case of an exit message
+%% ---------------------------------------------------------------
+
+clean_up(Win, Buff,Pid) ->
+
+ %% (???) Unlinks the traced process, but since we are using a safe link
+ %% it is probably unnecessary.
+
+ safe_unlink(Pid),
+
+ %% Kill helper processes
+
+ exit(Buff#buffer.converter, topquit),
+ exit(Buff#buffer.buffer, topquit),
+
+ gs:destroy(Win).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% exit_cmd/3 - Takes care of the necessary details when
+%% a linked process terminates.
+
+
+exit_cmd(Pid,_Reason, State) ->
+ case State#pman_shell.shell_flag of
+
+ %% This clause handles the case when a shell process dies.
+ %% Since it is restarted and the intention is to continue tracing
+ %% the restarted shell process, we need to handle it separately by
+ %% finding the new shell process.
+ true ->
+
+ NewShell = find_shell(),
+ safe_link(NewShell),
+ pman_relay:start(NewShell),
+
+ %% Update the window title with the new PID
+ Title = pman_win:title({shell, NewShell}),
+ Win = State#pman_shell.win,
+ gse:config(Win,[{title,Title}]),
+
+ pman_relay:trac(NewShell, true, flags()),
+
+ B = State#pman_shell.buffer,
+ B#buffer.converter!{raw,[{shell_died, Pid, NewShell}]},
+
+
+
+ State#pman_shell{pid=NewShell};
+
+ %% This clause handles the case when a traced process that is
+ %% not a shell process dies.
+ false ->
+
+ B = State#pman_shell.buffer,
+ B#buffer.converter!{raw,[{died, Pid}]},
+
+ lists:foreach(fun(X) -> gse:disable(X) end,
+ ['Options',
+ 'Kill',
+ 'LinksMenu']),
+ State#pman_shell{pid=undefined}
+ end.
+
+flags() ->
+ [send, 'receive', call, procs,
+ set_on_spawn, set_on_first_spawn, set_on_link, set_on_first_link].
+
+options_to_flaglists(Options) ->
+ AssocList =
+ [{Options#trace_options.send, send},
+ {Options#trace_options.treceive, 'receive'},
+ {Options#trace_options.inherit_on_1st_spawn, set_on_first_spawn},
+ {Options#trace_options.inherit_on_all_spawn, set_on_spawn},
+ {Options#trace_options.inherit_on_1st_link, set_on_first_link},
+ {Options#trace_options.inherit_on_all_link, set_on_link},
+ {Options#trace_options.events, procs},
+ {Options#trace_options.functions,call}],
+
+ TrueFun = fun ({Option,Flag}) ->
+ case Option of
+ true -> Flag;
+ _Otherwise -> false
+ end
+ end,
+ TrueFlags = mapfilter(TrueFun, AssocList),
+
+ FalseFun = fun ({Option,Flag}) ->
+ case Option of
+ false -> Flag;
+ _Otherwise -> false
+ end
+ end,
+ FalseFlags = mapfilter(FalseFun, AssocList),
+ {TrueFlags,FalseFlags}.
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% mapfilter/2 - Combines the functionality of lists:map and
+%% lists:filter. mapfilter applies the function argument to
+%% each element in the list. All returned values that are
+%% not false will occur in the resulting list.
+%%
+%% Arguments:
+%% Fun A fun that takes one argument
+%% List A list. Each element will become an argument to Fun.
+%%
+%% Returns:
+%% A list of all results from the map operation that are not false.
+%%
+
+mapfilter(Fun,[E|Es]) ->
+ case apply(Fun,[E]) of
+ false ->
+ mapfilter(Fun,Es);
+ Value -> [Value | mapfilter(Fun,Es)]
+ end;
+mapfilter(_Fun, []) -> [].
+
+
+
+perform_option_changes(Pid,Options,Buffer) ->
+
+ %% Notify the trace output functionality
+ %% if the destination is supposed to go to a file...
+
+ case Options#trace_options.to_file of
+ true ->
+ FName = Options#trace_options.file,
+ Buffer#buffer.converter!{file,FName};
+ false ->
+ done
+ end,
+
+ %%...then set the trace flags of the traced process
+
+ {OnFlags, OffFlags} = options_to_flaglists(Options),
+ case catch begin
+
+ %% (???) Note that the following calls cannot actually fail
+ %% This may be a problem. And the catch appears unnecessary
+ %% However, it may become necessary to let the
+ %% pman_relay:trac/3 function retrun appropriate values.
+ pman_relay:trac(Pid,true, OnFlags),
+ pman_relay:trac(Pid,false, OffFlags)
+ end of
+ true ->
+ ok;
+ _ -> pman_win:format("** Illegal trace request ** \n", [])
+ end.
+
+
+
+
+
+
+%% ---------------------------------------------------------------
+%% Take care of the command executed by the user.
+
+execute_cmd(Cmd,Shell_data) ->
+ Window = Shell_data#pman_shell.win,
+ Editor = Shell_data#pman_shell.editor,
+ Shell = Shell_data#pman_shell.pid,
+ Buffer = Shell_data#pman_shell.buffer,
+ TraceOptions = Shell_data#pman_shell.trace_options,
+
+ case Cmd of
+ 'Close' ->
+ db_delete_key (Shell_data#pman_shell.db, Shell_data#pman_shell.pid),
+ clean_up(Window, Buffer, Shell),
+ exit(quit);
+ 'Destroy' ->
+ db_delete_key (Shell_data#pman_shell.db, Shell_data#pman_shell.pid),
+ exit(Buffer#buffer.buffer,topquit),
+ safe_unlink(Shell),
+ exit(Buffer#buffer.converter,topquit),
+ exit(Buffer#buffer.buffer,topquit),
+ exit(quit);
+
+ 'Clear' when is_pid(Shell) ->
+ New_buffer = pman_buf:clear(Buffer,pman_win:display(Shell),
+ TraceOptions#trace_options.file),
+ Shell_data#pman_shell{buffer = New_buffer};
+ 'Save buffer' ->
+ DefaultFile = "Pman_buffer." ++ default_file_name(Shell),
+ Result = tool_utils:file_dialog([{type,save},
+ {file,DefaultFile}]),
+ case Result of
+ {ok, UserFile, _State} ->
+ Buffer#buffer.buffer!{save_buffer,UserFile};
+ {error,_Reason} ->
+ true
+ end,
+ Shell_data;
+ 'Help' ->
+ HelpFile = filename:join([code:lib_dir(pman), "doc", "html", "index.html"]),
+ tool_utils:open_help(gs:start([{kernel, true}]), HelpFile),
+ Shell_data;
+ 'Kill' when is_pid(Shell) ->
+ exit(Buffer#buffer.converter,killed),
+ exit(Buffer#buffer.buffer,killed),
+ lists:foreach(fun(X) -> gse:disable(X) end,
+ ['TraceMenu',
+ 'Clear']),
+ catch exit(Shell, kill),
+ Shell_data#pman_shell{pid = undefined};
+ 'All Links' when is_pid(Shell) ->
+ LIPid = pman_process:pinfo(Shell, links),
+ ?ALWAYS_ASSERT("Just a brutal test"),
+ start_list(LIPid,
+ Shell_data#pman_shell.father,
+ Shell_data#pman_shell.trace_options),
+ Shell_data;
+ 'Module' when is_pid(Shell) ->
+ {ModuleName,_,_} = pman_process:function_info(Shell),
+ pman_module_info:start(ModuleName),
+ Shell_data;
+ 'Options' when is_pid(Shell) ->
+ case pman_options:dialog(Window,
+ "Trace Options for Process",
+ TraceOptions) of
+ {error, _Reason} ->
+ Shell_data;
+ Options ->
+ perform_option_changes(Shell, Options, Buffer),
+ Shell_data#pman_shell{trace_options=Options}
+ end;
+
+ {trac,Choice,Bool} when is_pid(Shell) ->
+ pman_relay:trac(Shell, Bool, [Choice]),
+ Shell_data;
+
+
+ {configure,{X,Y}} ->
+ configure (Editor, X, Y),
+ Shell_data;
+
+ Pid when is_pid(Pid) ->
+ pman_shell:start({Pid, Shell_data#pman_shell.father},
+ Shell_data#pman_shell.trace_options),
+ Shell_data;
+ _Other ->
+ ?ALWAYS_ASSERT("Received unexpected event"),
+ Shell_data
+ end.
+
+
+default_file_name(Shell) when is_pid(Shell) ->
+ [A,B,C] = string:tokens(pid_to_list(Shell),[$.,$<,$>]),
+ "pman_trace." ++ A ++ "_" ++ B ++ "_" ++ C;
+default_file_name(_OTHER) ->
+ "shell".
+
+
+
+
+
+%% Key accellerators
+
+key(e) -> 'Clear';
+key(s) -> 'Save buffer';
+key(c) -> 'Close';
+key(a) -> 'All';
+key(r) -> 'Reset';
+key(m) -> 'Module';
+key(l) -> 'All Links';
+key(k) -> 'Kill';
+key(h) -> 'Help';
+key(z) -> 'Close';
+key(O) -> O.
+
+
+
+%% ---------------------------------------------------------------
+%% The main loop takes care of data coming in from the traces, as
+%% well as exit signals from proceses we are monitoring. Events
+%% caused by the user or window manager are also handled here.
+%% ---------------------------------------------------------------
+
+
+monitor_loop(Shell_data) ->
+ receive
+
+ %% WM destroy
+ {gs,_Window,destroy,[],[]} -> %%Avoid links menus
+ execute_cmd('Destroy', Shell_data);
+
+
+ %% Handle EXIT signal from parent process
+ {'EXIT', _Pid, topquit} ->
+ clean_up(Shell_data#pman_shell.win,
+ Shell_data#pman_shell.buffer,
+ Shell_data#pman_shell.pid),
+ exit(topquit);
+
+ %% (???) Ignore "stray" EXIT signal from converter
+ {'EXIT', _Pid, win_killed} ->
+ monitor_loop(Shell_data);
+
+
+ %% Handle EXIT signal from safely linked Pid
+ %% This is received when a traced process dies.
+ {'SAFE_EXIT', Pid, Reason} ->
+ New_Shell_data = exit_cmd(Pid, Reason,Shell_data ),
+ monitor_loop(New_Shell_data);
+
+
+ %% Handle EXIT signal from processes where we expect
+ %% some EXIT signals, such as the file_dialog opened, and possibly
+ %% others.
+
+ {'EXIT', _Pid, _Reason} ->
+ monitor_loop(Shell_data);
+
+ %% Handle incoming trace messages
+ Message when is_tuple(Message) , element(1,Message) == trace->
+ {L, Suspended} = collect_tracs([Message]),
+ Buffer = Shell_data#pman_shell.buffer,
+ Buffer#buffer.converter!{raw,L},
+ lists:foreach(fun(P) -> erlang:resume_process(P) end, Suspended),
+ monitor_loop(Shell_data);
+
+
+ %% All other messages on the form {...,...,...}
+ Message when is_tuple(Message) ->
+ do_link_stuff(Shell_data),
+
+ New_Shell_data = process_gs_event(Message,Shell_data),
+ monitor_loop(New_Shell_data);
+
+ %% Catch all for unexpected messages
+ _Anything ->
+ ?ALWAYS_ASSERT("Received unexpected event"),
+ monitor_loop(Shell_data)
+
+ end.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% process_event/1 - Error handling wrapper for gs_cmd
+
+process_gs_event(Message, Shell_data) ->
+ case catch gs_cmd(Message,Shell_data) of
+
+ %%
+ %% Error exits from gs_cmd
+
+ {'EXIT', badrpc} ->
+ Text = "\nERROR: Could not access node",
+ pman_win:msg_win(Text),
+ Shell_data;
+ {'EXIT', dead} ->
+ Text = "\nERROR: The process is dead",
+ pman_win:msg_win(Text),
+ Shell_data;
+
+ %% A controlled application initiated termination
+ {'EXIT', quit} ->
+ db_delete_key (Shell_data#pman_shell.db, Shell_data#pman_shell.pid),
+ exit(quit);
+
+
+ {'EXIT',Reason} ->
+ db_delete_key (Shell_data#pman_shell.db, Shell_data#pman_shell.pid),
+ io:format("Debug info, Reason: ~p~n",[Reason]),
+ ?ALWAYS_ASSERT("Unexpected EXIT reason"),
+ exit({unexpected_EXIT_reason,Reason});
+
+ %%
+ %% "Proper" exits from gs_cmd
+
+ New_Shell_data ->
+ New_Shell_data
+ end.
+
+
+
+gs_cmd(Cmd, Shell_data) ->
+ case Cmd of
+
+ %%User Command
+ {gs, Command, click, _Data, _Args} ->
+ execute_cmd(Command,Shell_data);
+
+ %%Key accellerator
+ {gs,_Window,keypress,_D,[Key,_,0,1]} ->
+ execute_cmd(key(Key),Shell_data);
+
+ %%Window Resize
+ {gs,_Window,configure,_,[X,Y|_]} ->
+ execute_cmd({configure,{X,Y}},Shell_data);
+
+
+ {gs, _Object, _Event, _Data, _Args} ->
+ ?ALWAYS_ASSERT("Unhandled gs event"),
+ Shell_data
+
+ end.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% (???) do_link_stuff/1 - I have no clue.
+%%
+
+do_link_stuff(Shell_data) ->
+
+ %% This appears to be code to execute for adding
+ %% dynamic links menus.
+
+ case Shell_data#pman_shell.pid of
+ undefined ->
+ ok;
+ Pid ->
+ case pman_process:pinfo(Pid, links) of
+ Links when is_list(Links) ->
+ pman_win:links_menus(Links);
+ undefined ->
+ ok
+ end
+ end.
+
+
+%% (???) Process dictionary used to safe Pid-Pid pairs.
+%%
+%% safe_link/1 - Spawns a process, that links to the Pid, and sends
+%% a message to the caller when the linked process dies.
+%%
+%% Since we (think we) need to link to the traced process, we want
+%% to do it in a way that has the smallest possible risk. The process
+%% that links to the Pid is small and simple, which is safer than if
+%% the calling process would link directly to the Pid.
+
+safe_link(Pid) when is_pid(Pid) ->
+ Self = self(),
+ PidSafe = spawn_link(fun() -> safe_init(Self, Pid) end),
+ put(Pid, PidSafe).
+
+
+%% safe_unlink/1 - Removes a safe link
+%%
+
+safe_unlink(Pid) when is_pid(Pid) ->
+ PidSafe = get(Pid),
+ PidSafe ! {unlink, self(), Pid},
+ erase(Pid);
+
+safe_unlink(_Anything)->
+ true.
+
+%% safe_init/2 - Initialize a simple receive loop that controls safe linking
+%% to application processes.
+%%
+safe_init(Caller, Pid) ->
+
+ process_flag(trap_exit, true),
+ link(Pid),
+
+ safe_loop(Caller, Pid).
+
+
+%% safe_loop/2 - Simply waits for an exit signal from the linked Pid,
+%% all other messages are disregarded.
+%%
+
+
+safe_loop(Caller, Pid) ->
+ receive
+ %% Linked process dies
+ {'EXIT' , Pid, Reason} ->
+ Caller ! {'SAFE_EXIT', Pid, Reason};
+
+ %% Caller dies
+ {'EXIT', Caller, _Reason} ->
+ unlink(Pid);
+
+
+ %% Unlink request
+ {unlink, Caller, Pid} ->
+ unlink(Pid);
+
+ %% Ignore everything else
+ _Anything ->
+ safe_loop(Caller, Pid)
+ end.
+
+
+
+configure (Editor, W, H) ->
+ gs:config (Editor, [{width, W - 3},
+ {height, H - 40}]).
+
+
+
+
+%%% The DB is used to avoid multiple trace windows
+%%% of the same process.
+
+%%% db_start /0
+%%%
+
+db_start() ->
+ case ets:info(?PMAN_DB) of
+ undefined -> ets:new(?PMAN_DB, [public, named_table]);
+ _ -> ?PMAN_DB
+ end.
+
+
+
+%%% db_insert_key /2
+%%%
+
+db_insert_key (Db, Pid) ->
+ case ets:lookup (Db, Pid) of
+ [] ->
+ case catch ets:insert (Db, {Pid}) of
+ true ->
+ true;
+
+ _Error ->
+ error_insert_db
+ end;
+
+ _already_exists ->
+ false
+ end.
+
+
+
+%%% db_delete_key /2
+%%%
+
+db_delete_key (Db, Pid) ->
+ ets:delete (Db, Pid).
+
+
+%% Function to collect all trace messages in the receive queue.
+%% Returns: {Messages,SuspendedProcesses}
+
+collect_tracs(Ack) -> collect_tracs(Ack, ordsets:new()).
+
+collect_tracs(Ack, Procs) ->
+ receive
+ Trac when is_tuple(Trac), element(1, Trac) == trace ->
+ P = suspend(Trac, Procs),
+ collect_tracs([Trac | Ack], P)
+ after 0 ->
+ {lists:reverse(Ack), ordsets:to_list(Procs)}
+ end.
+
+suspend({trace,From,call,_Func}, Suspended) when node(From) == node() ->
+ case ordsets:is_element(From, Suspended) of
+ true -> Suspended;
+ false ->
+ case (catch erlang:suspend_process(From)) of
+ true ->
+ ordsets:add_element(From, Suspended);
+ _ ->
+ Suspended
+ end
+ end;
+suspend(_Other, Suspended) -> Suspended.
diff --git a/lib/pman/src/pman_tool.erl b/lib/pman/src/pman_tool.erl
new file mode 100644
index 0000000000..1d33fb9764
--- /dev/null
+++ b/lib/pman/src/pman_tool.erl
@@ -0,0 +1,145 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(pman_tool).
+
+%% Listbox selection window
+
+-export([select/3]).
+
+-record(state, {topwin,
+ frame,
+ listbox}).
+
+%% Constants
+-define(WIN_WIDTH, 350).
+-define(WIN_HEIGHT, 350).
+
+select(Win, Title, Choices) ->
+ Self = self(),
+ Pid = spawn_link(fun() -> init(Self, Win, Title, Choices) end),
+ receive
+ {Pid, Result} ->
+ Result
+ end.
+
+init(Pid, Win, Title, Choices) ->
+
+ %% Create window
+ State = create_window(Win, Title, Choices),
+
+ gse:map(State#state.topwin),
+
+ %% enter event loop
+ loop(Pid, Choices, State).
+
+loop(Pid, Choices, State) ->
+ receive
+ {gs, _, destroy, _Data, _Args} ->
+ Pid ! {self(), cancelled};
+ {gs, _, configure, _Data, [W, H|_]} ->
+ gse:resize(State#state.frame, W, H),
+ loop(Pid, Choices, State);
+ {gs, _, click, ok, _Args} ->
+ case gs:read(State#state.listbox, selection) of
+ [] ->
+ Pid ! {self(), cancelled};
+ Indices ->
+ Selection = selection(Indices, Choices),
+ Pid ! {self(), Selection}
+ end;
+ {gs, _, click, cancel, _Args} ->
+ Pid ! {self(), cancelled};
+ {gs, Obj, doubleclick, _Data, _Args} ->
+ self() ! {gs, Obj, click, ok, []},
+ loop(Pid, Choices, State);
+ _GSEvent ->
+ loop(Pid, Choices, State)
+ end.
+
+selection(Indices, Choices) ->
+ selection(0, Indices, Choices).
+
+selection(I, [I|Is], [{Val,_Str}|Vals]) ->
+ [Val | selection(I+1, Is, Vals)];
+selection(I, [I|Is], [Val|Vals]) ->
+ [Val | selection(I+1, Is, Vals)];
+selection(_I, [], _Vals) ->
+ [];
+selection(I, Is, [_Val|Vals]) ->
+ selection(I+1, Is, Vals).
+
+create_window(Win, Title, Choices) ->
+ Font = pman_win:font(Win),
+
+ %% Top window and a frame that covers it entirely, to allow
+ %% usage of the packer for geometry management.
+ Topwin = gse:window(Win, [{width, ?WIN_WIDTH},
+ {height,?WIN_HEIGHT},
+ {configure, true},
+ {title, Title}]),
+ Frame = gse:frame(Topwin, [{packer_x,[{stretch,1},
+ {stretch,1}]},
+ {packer_y,[{stretch,1},
+ {stretch,5},
+ {stretch,1}]}]),
+
+ %% Caption above the list of items
+ CaptionTxt = "Select one or more of the following:",
+ gse:label(Frame, [{pack_x,{1,2}},
+ {pack_y,{1,1}},
+ {label,{text,CaptionTxt}}, {font,Font}]),
+
+ %% List of selectable items
+ Listbox = gse:listbox(Frame, [{pack_x,{1,2}},
+ {pack_y,{2,2}},
+ {selectmode,multiple},
+ {doubleclick, true},
+ {font,Font},
+ {items, str_choices(Choices)}]),
+
+ %% OK and Cancel buttons in a separate frame.
+ F13 = gse:frame(Frame, [{bw,1},
+ {pack_xy,{{1,2},3}},
+ {packer_x,[{stretch,1},
+ {fixed, 60},
+ {stretch,1},
+ {fixed, 60},
+ {stretch,1}]},
+ {packer_y,[{stretch,1},
+ {fixed, 30},
+ {stretch,1}]}]),
+
+ gse:button(F13, [{pack_xy,{2,2}},
+ {label,{text,"OK"}}, {font,Font},
+ {data,ok}]),
+ gse:button(F13, [{pack_xy,{4,2}},
+ {label,{text,"Cancel"}}, {font,Font},
+ {data,cancel}]),
+
+ gse:resize(Frame, ?WIN_WIDTH, ?WIN_HEIGHT),
+ #state{topwin=Topwin, frame=Frame, listbox=Listbox}.
+
+str_choices(Choices) ->
+ lists:map(
+ fun({Val, Str}) ->
+ lists:flatten(io_lib:format("~p: ~s", [Val, Str]));
+ (Term) ->
+ lists:flatten(io_lib:format("~p", [Term]))
+ end,
+ Choices).
diff --git a/lib/pman/src/pman_win.erl b/lib/pman/src/pman_win.erl
new file mode 100644
index 0000000000..52d5a237cf
--- /dev/null
+++ b/lib/pman/src/pman_win.erl
@@ -0,0 +1,667 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1996-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+%% ------------------------------------------------------------
+%% Purpose: window management and the gs interface
+%% ------------------------------------------------------------
+
+-module(pman_win).
+
+%% ---------------------------------------------------------------
+%% The user interface exports
+%% ---------------------------------------------------------------
+
+-export([pman_window/3, window/1, module_data/1, display/1, format/2,
+ dialog_window/2, configeditor/2, configwin/3,
+ update/1, update/3,
+ msg_win/1, title/1,
+ remove_menu/1, add_menu/3,
+ change_colour/3, links_menus/1, calc_columnwidths/1]).
+-export([font/0, font/1]).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Constants
+%%
+-include("pman_win.hrl").
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% pman_window/3 - Create a GS window and components for the
+%% Pman overview window, the main window.
+%%
+%% Arguments:
+%% Size number of processes
+%% HiddenModules list of modules
+%% Nodes list of supervised nodes
+%%
+%% Return:
+%% {Win, Grid, Frame, Procnum, W, H} where
+%% Win The GS top window
+%% Grid The GS grid
+%% Procnum Number of displayed processes
+%%
+
+pman_window(Size, _HiddenModules, Nodes) ->
+ GS = gs:start([{kernel,true}]),
+ Font = font(GS),
+ Win_Options = [{title, lists:concat(["Pman: Overview on ",node()])},
+ {width, ?WIN_WIDTH}, {height, ?WIN_HEIGHT},
+ {destroy, true},
+ {keypress,true}],
+ Win = gs:create(window, GS, Win_Options),
+
+ %% Menu bar
+ MenuBar = gs:create(menubar, Win, []),
+ MBFile = gs:create(menubutton, MenuBar, [{label,{text," File "}},
+ {font,Font},
+ {underline,1}]),
+ MBView = gs:create(menubutton, MenuBar, [{label,{text, " View "}},
+ {font,Font},
+ {underline,1}]),
+ MBTrace = gs:create(menubutton, MenuBar, [{label,{text, " Trace "}},
+ {font,Font},
+ {underline,1}]),
+ MBHelp = gs:create(menubutton, MenuBar, [{label, {text, " Help "}},
+ {font,Font},
+ {side,right},
+ {underline,1}]),
+
+ %% Addition of a menu for distribution
+ add_node_menu(MenuBar, Nodes, Font),
+
+ %% All menu buttons
+ MenuFile = gs:create(menu, MBFile, []),
+ MenuView = gs:create(menu, MBView, []),
+ MenuTrace = gs:create(menu, MBTrace, []),
+ MenuHelp = gs:create(menu, MBHelp, []),
+
+ %% File menu
+ gse:named_menuitem('Default Options', MenuFile,
+ [{label,{text,"Options..."}}, {font,Font},
+ {underline,0}]),
+ gse:named_menuitem('Save Options',MenuFile,
+ [{label,{text,"Save Options"}}, {font,Font}]),
+ gse:named_menuitem('Exit', MenuFile,
+ [{label,{text,"Exit"}}, {font,Font},
+ {underline,0}]),
+
+ %% View menu
+ gse:named_menuitem('Hide All',MenuView,
+ [{label, {text, "Hide All Processes"}},
+ {font,Font},
+ {underline,1}]),
+
+ gse:named_menuitem('Hide Modules', MenuView,
+ [{label, {text, "Hide Modules..."}},
+ {font,Font},
+ {underline,8}]),
+
+ gse:named_menuitem('Hide Selected Process', MenuView,
+ [{label, {text, "Hide Selected Process"}},
+ {font,Font},
+ {underline,2}]),
+
+ gse:named_menuitem('Module',MenuView,
+ [{label, {text, "Module Info..."}}, {font,Font},
+ {underline,7}]),
+
+ gse:named_menuitem('Refresh', MenuView,
+ [{label, {text, "Refresh"}}, {font,Font},
+ {underline,0}]),
+
+ gse:named_menuitem('Show All',MenuView,
+ [{label, {text, "Show All Processes"}},
+ {font,Font}]),
+
+ gse:named_menuitem('Show Selected',MenuView,
+ [{label, {text, "Show Processes..."}},
+ {font,Font}]),
+
+ %% Trace menu
+ gs:create(menuitem, 'Kill', MenuTrace, [{label,{text, "Kill"}},
+ {font,Font},
+ {underline,0}]),
+
+ gs:create(menuitem, 'Trace Process', MenuTrace,
+ [{label, {text, "Trace Selected Process"}}, {font,Font},
+ {underline,0}]),
+
+ gs:create(menuitem,'Trace Shell', MenuTrace,
+ [{label, {text,"Shell Process"}}, {font,Font},
+ {underline,0}]),
+
+ %% Help menu
+ gs:create(menuitem,'Help', MenuHelp, [{label, {text, "Help" }},
+ {font,Font},
+ {underline,0}]),
+
+ %% Window contents
+
+ %% Geometry managing frame
+ Frame = gse:frame(Win, [{y,?MENU_HEIGHT},
+ {packer_x,[{stretch, 1}]},
+ {packer_y,[{stretch,10},
+ {fixed,?CHECKBAR_HEIGHT}]}]),
+
+
+
+ %% Grid
+ Grid_Options = [
+ {pack_x,1}, {pack_y,1},
+ {fg,black},
+ {vscroll,right},{hscroll,bottom},
+ calc_columnwidths(739),
+ {rows, {1,Size}}],
+ Grid = gse:grid(Frame,Grid_Options),
+
+
+ %% Checkbutton bar at the bottom of the window
+
+ CheckBar = gse:frame(Frame, [{pack_x,1},
+ {pack_y,2},
+ {packer_x,[{stretch, 2, 100,300},
+ {stretch, 2, 100,300},
+ {stretch,1},
+ {stretch, 2,100,300}]},
+ {packer_y,[{stretch,1}]}]),
+ gse:named_checkbutton('Hide System',CheckBar,
+ [{pack_xy,{1,1}},
+ {justify, left},
+ {align,w},
+ {width, 200},
+ {font, Font},
+ {label, {text, "Hide System Processes" }}]),
+
+ gse:named_checkbutton('Auto Hide New',CheckBar,
+ [{pack_xy,{2,1}},
+ {width, 200},
+ {justify, left},
+ {align,w},
+ {font, Font},
+ {label, {text, "Auto-Hide New" }}]),
+
+ gse:named_label('Number Hidden',CheckBar,
+ [{pack_xy,{4,1}},
+ {justify, left},
+ {align,w},
+ {width, 200},
+ {font, Font},
+ {label, {text, ?CPIDHIDDENTEXT }}]),
+
+ %% Finalize it!
+ gse:map(Win),
+ gse:config(Win,[raise]),
+ gse:config(Win,[{configure,true}]),
+
+
+ {Win, Grid, Frame, length(processes())+1, ?WIN_WIDTH, ?WIN_HEIGHT}.
+
+
+%% Calculate columnwidths in respect to the size of the window.
+
+calc_columnwidths(Width) ->
+ if
+ Width =< 739 ->
+ {columnwidths,[75,215,146,90,105,105]};
+ true ->
+ S = (Width - 75)/(215+146+90+105+105),
+ {columnwidths,[75,round(215*S),round(146*S),round(90*S),
+ round(105*S),round(105*S)]}
+ end.
+
+%% ---------------------------------------------------------------
+%% Create a trace window
+%%
+%% Process, a process id or an atom
+%%
+%% Return: A window and a editor
+%% ---------------------------------------------------------------
+
+
+window(Process) ->
+ GS = gs:start([{kernel,true}]),
+ Font = font(GS),
+ Win_Options = [{title,title(Process)}, {width,550}, {keypress,true},
+ {configure,true},
+ {destroy,true},{height, 400}],
+ Win = gs:create(window,GS,Win_Options),
+
+ MenuBar = gs:create(menubar, Win, []),
+
+ %% File menu
+ MBFile = gs:create(menubutton,MenuBar,[{label,{text," File "}},
+ {font,Font},
+ {underline, 1}]),
+ MenuFile = gs:create(menu, MBFile, []),
+ make_menus(pman_process:is_running(Process), MenuBar, MenuFile,
+ Font),
+
+ gse:named_menuitem('Save buffer',MenuFile,
+ [{label,{text, "Save buffer..."}},
+ {font,Font},
+ {underline,0}]),
+ gse:named_menuitem('Close',MenuFile,
+ [{label, {text, "Close"}},
+ {font,Font},
+ {underline,0}]),
+
+
+ Editor = gs:create(editor,Win,[{x,3}, {y,40},
+ {width,546}, {height,348},
+ {font,Font}]),
+ gs:config(Editor, [{keypress, true},{insert, {'end', display(Process)}}]),
+ gs:config(Editor, [{enable, false},{vscroll, right}, {hscroll, bottom},
+ {wrap,none}]),
+ gs:config(Win, [{map, true}]),
+ {Win, Editor}.
+
+%% ---------------------------------------------------------------------
+%% Menu Help Fuctions
+%% ---------------------------------------------------------------------
+
+
+links_menus(Links) ->
+ gs:destroy('Links'),
+ gs:create(menu,'Links','LinksMenu',[]),
+ Flag = case links_menus(Links,[]) of
+ [] -> false;
+ Pids ->
+ add_menu('Links', Pids, "Trace"),
+ true
+ end,
+ gse:config('LinksMenu',[{enable,Flag}]).
+
+links_menus([],Pids) -> Pids;
+links_menus([Pid|Links],Pids) when is_pid(Pid) ->
+ links_menus(Links,[Pid|Pids]);
+links_menus([_Port|Links],Pids) ->
+ links_menus(Links,Pids).
+
+
+%% Create the node menu.
+
+add_node_menu(MenuBar, Nodes, Font) ->
+ MBNode = gs:create(menubutton, MenuBar, [{label,{text, " Nodes "}},
+ {font,Font},
+ {underline, 1}]),
+ gs:create(menu, node, MBNode, []),
+ add_menu(node, Nodes, "Show", Font),
+ gse:disable(node()).
+
+
+%% ---------------------------------------------------------------------
+%% Add Menus in the list under Menu menuitem.
+
+add_menu(Menu, Names, Tag) ->
+ add_menu(Menu, Names, Tag, font()).
+
+add_menu(_Menu, [], _Tag, _Font) -> ok;
+add_menu(Menu, [Name|Names], Tag, Font) ->
+ Title = io_lib:format("~s ~p",[Tag, Name]),
+ gs:create(menuitem,Name,Menu,[{label,{text,Title}},
+ {font,Font},
+ {data,{Menu,Name}}]),
+ add_menu(Menu, Names, Tag, Font).
+
+%% ---------------------------------------------------------------------
+%% Remove a specific menu item, or a whole menu, or a list of both.
+%%
+
+remove_menu(List) when is_list(List)->
+ lists:foreach(fun(X) -> gs:destroy(X) end, List);
+
+remove_menu(Object) ->
+ gse:destroy(Object).
+
+
+%% ---------------------------------------------------------------------
+%% If the trace window opened is supposed to trace a real pid, let us
+%% add the trace menu, and other items specific to tracing. If not,
+%% the only menus available are the ones in the default defined in
+%% window(Pid).
+
+make_menus(false, _, _, _) -> ok;
+make_menus({true,Pid}, MenuBar, MenuFile, Font) ->
+ MBView = gs:create(menubutton,'ViewMenu',MenuBar,
+ [{underline,1},
+ {label,{text," View "}}, {font,Font},
+ {side,left}]),
+ MenuView = gs:create(menu, MBView, []),
+
+ MBTrace = gs:create(menubutton,'TraceMenu',MenuBar,
+ [{underline,1},
+ {label,{text," Trace "}}, {font,Font},
+ {side,left}]),
+ MenuTrace = gs:create(menu, MBTrace, []),
+
+
+ MBHelp = gs:create(menubutton,'HelpMenu',MenuBar,
+ [{underline,1},
+ {label,{text," Help "}}, {font,Font},
+ {side,right}]),
+ MenuHelp = gs:create(menu, MBHelp, []),
+
+ %% File menu
+ gse:named_menuitem('Options', MenuFile,
+ [{label, {text, "Options..."}}, {font,Font},
+ {underline,0}]),
+
+ %% Trace menu
+ gse:named_menuitem('All Links', MenuTrace,
+ [{label, {text, "All Linked Processes"}},
+ {font,Font},
+ {underline,0}]),
+ gse:named_menuitem('LinksMenu', MenuTrace,
+ [{underline,0},
+ {label, {text, "Linked Process..."}},
+ {font,Font},
+ {itemtype, cascade},
+ {enable,false}]),
+ gs:create(menu,'Links','LinksMenu',[]),
+ case pman_process:pinfo(Pid, links) of
+ Links when is_list(Links) ->
+ links_menus(Links);
+ undefined ->
+ lists:foreach(fun(X) -> gse:disable(X) end,['LinksMenu'])
+ end,
+ gse:named_menuitem('Kill', MenuTrace,
+ [{label, {text, "Kill"}}, {font,Font},
+ {underline,0}]),
+
+ %% View menu
+ gse:named_menuitem('Clear', MenuView,
+ [{label, {text, "Clear buffer"}}, {font,Font},
+ {underline,0}]),
+
+ gse:named_menuitem('Module', MenuView,
+ [{label, {text, "Module Info"}}, {font,Font},
+ {underline,0}]),
+
+ %% Help menu
+ gse:named_menuitem('Help', MenuHelp,
+ [{label, {text, "Help"}}, {font,Font},
+ {underline,0}]).
+
+%% ---------------------------------------------------------------------
+%% Configurate the actual editor
+%%
+%% Editor, actual editor
+%% Options, actual options for the editor
+%%
+%% Return: A configurated editor with the actual options
+%% ---------------------------------------------------------------------
+
+configeditor(Editor, Options) ->
+ gs:config(Editor, Options).
+
+%% ---------------------------------------------------------------------
+%% Configure the actual window after it has been resized.
+%% ---------------------------------------------------------------------
+
+configwin(Object, W, H) ->
+ Dx = abs(W - gs:read(Object,width) - 4),
+ Dy = abs(H - gs:read(Object,height) - 42),
+ if
+ Dx + Dy =/= 0 ->
+ gs:config(Object,[{width,W - 4}]);
+ true -> ok
+ end.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% update/1, 3
+update(NoOfHidden) ->
+ Str = lists:flatten(io_lib:format(?CPIDHIDDENTEXT++"~w",
+ [NoOfHidden])),
+ gse:config('Number Hidden', [{label, {text,Str}}]).
+
+update(Grid, ShowInfoR, NoOfHidden) ->
+
+ %% We reverse the list because we want the processes to appear with
+ %% the newest (=highest) pid first in the list.
+ ShowInfo = lists:reverse(ShowInfoR),
+
+ %% Set the length of the grid
+ CGridline = length(ShowInfo) + 1,
+ gs:config(Grid, [{rows, {1,CGridline}}]),
+
+ %% Add the header line
+ add_gridline(Grid,
+ 1,
+ {'Pid','Current Function','Name','Msgs','Reds','Size'},
+ []),
+
+ update(NoOfHidden),
+
+ %% Recurse through the ordset of pids
+ update_r(Grid, ShowInfo, 2).
+
+update_r(Grid, [], Row) ->
+ delete_gridlines(Grid, Row);
+update_r(Grid, [{Pid,Func,Name,Msgs,Reds,Psize}|ShowInfo], Row) ->
+ {M, F, A} = Func,
+ FuncText = lists:flatten(io_lib:format("~w:~w/~w", [M, F, A])),
+ add_gridline(Grid,
+ Row,
+ {Pid, FuncText, Name, Msgs, Reds, Psize},
+ [{data,{pidfunc,Pid,Func}}]),
+ update_r(Grid, ShowInfo, Row+1).
+
+add_gridline(Grid, Row, Tuple, LIOptSpec) ->
+ {Pid, FuncText, Name, Msgs, Reds, Psize} = Tuple,
+ LIOpt = [{click,true},
+ {doubleclick,true},
+ {fg, colour(Row)},
+ {text,{1,Pid}},
+ {text,{2,FuncText}},
+ {text,{3,Name}},
+ {text,{4,Msgs}},
+ {text,{5,Reds}},
+ {text,{6,Psize}} |LIOptSpec],
+ case gs:read(Grid, {obj_at_row, Row}) of
+ undefined ->
+ gse:gridline(Grid,[{row, Row}|LIOpt]);
+ GridLine ->
+ gs:config(GridLine,LIOpt)
+ end.
+
+delete_gridlines(Grid, Row) ->
+ case gs:read(Grid, {obj_at_row, Row}) of
+ undefined ->
+ ok;
+ GridLine ->
+ gs:destroy(GridLine),
+ delete_gridlines(Grid, Row+1)
+ end.
+
+colour(1) ->
+ ?HEADER_COLOUR;
+colour(_Row) ->
+ ?UNSELECTED_COLOUR.
+
+%% Interchange colours between two rows
+change_colour(Grid, Row, Row) ->
+ Gitem = gs:read(Grid, {obj_at_row,Row}),
+ gs:config(Gitem, {fg,?SELECTED_COLOUR});
+change_colour(Grid, From, To) ->
+ Gitem_to = gs:read(Grid, {obj_at_row,To}),
+ Gitem_fr = gs:read(Grid, {obj_at_row,From}),
+ gs:config(Gitem_to, {fg,?SELECTED_COLOUR}),
+ gs:config(Gitem_fr, {fg,colour(From)}).
+
+%% --------------------------------------------------------------
+%% Create a title for the window
+%% Return: the title
+%% --------------------------------------------------------------
+
+title({module, Mod}) ->
+ lists:flatten([io_lib:format("Pman: Module info ~p", [Mod])]);
+
+title({shell, Sh} ) ->
+ lists:flatten([io_lib:format("Pman: Shell process ~p on ~p",
+ [Sh,node(Sh)])]);
+
+title(Sh) ->
+ lists:flatten([io_lib:format("Pman: Process ~p on ~p",
+ [Sh, node(Sh)]),name(Sh)]).
+name(Pid) ->
+ case pman_process:pinfo(Pid, registered_name) of
+ undefined -> "";
+ Name ->
+ lists:flatten([io_lib:format("[~p]", [Name])])
+ end.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% module_data/1 - %% Returns the module information for a
+%% module, on a format suitable to insert into a GS editor.
+%%
+%% Arguments:
+%% ModuleName The module
+%%
+%% Returns:
+%% A string with module information.
+%%
+
+module_data(ModuleName) ->
+ vformat("", catch apply({ModuleName, module_info},[])).
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% display/1 -
+%%
+
+display({_,Pid,_}) -> display(Pid);
+display({_,Pid}) -> display(Pid);
+display(Pid) when is_pid(Pid) ->
+ case pman_process:pinfo(Pid) of
+ undefined ->
+ format('Process is dead~n',[]);
+ Other ->
+ proc_format(Other)
+ end.
+
+%% --------------------------------------------------------------
+%% Format functions for the shell and help window.
+%% --------------------------------------------------------------
+
+vformat(Pad, {M,F,A}) when is_atom(F) ->
+ Pad2 = lists:append(Pad,mkpad(io_lib:format("~w:~w",[M,F]))),
+ lists:flatten([format("~p:~p", [M,F]),argformat(Pad2, A)]);
+
+vformat(Pad, [H|T]) ->
+ kvformat(Pad, [H|T],"[");
+
+vformat(_Pad, X) -> format("~p~n", [X]).
+
+format(Format) -> format(Format, []).
+
+format(Format, Args) ->
+ io_lib:format(Format, Args).
+
+
+kvformat(S, [Item],Buff) ->
+ lists:reverse([format("\n~s~p]\n",[S,Item])|Buff]);
+
+kvformat(S,[H|T],Buff) ->
+ kvformat(S,T,[format("\n~s~p, ",[S,H])|Buff]);
+
+kvformat(_,[],Buff) ->
+ lists:reverse(["]\n"|Buff]).
+
+argformat(_Pad,A) when is_integer(A) ->
+ format("/~p\n", [A]);
+argformat(_,A) ->
+ lists:flatten([format("/~p\n", [length(A)]),
+ format("args: \n"),
+ argformat2(" ", A)]).
+
+argformat2(Pad, Arglist) ->
+ Chars = lists:flatten(io_lib:format("~p",[Arglist])),
+ if
+ length(Chars) < (70 - length(Pad)) ->
+ format("~s~s\n", [Pad, Chars]);
+ true ->
+ argformat3(Pad, Arglist)
+ end.
+
+argformat3(_,[]) -> format("\n");
+argformat3(Pad, [H|T]) ->
+ Chars = truncate(65,io_lib:format("~s~p",[Pad, H])),
+ format("~s,\n", [Chars]),
+ argformat3(Pad, T).
+
+pformat(false) -> [];
+pformat({value,{_, 0}}) -> [];
+pformat({value,{_, []}}) -> [];
+pformat({value, {Key, Vals}}) ->
+ Pad = mkpad(io_lib:format("~p ",[Key])),
+ format(lists:flatten(["~p: " ,vformat(Pad, Vals), "~n"]), [Key]).
+
+truncate(0, _Chars) -> ".....";
+truncate(I, [H|T]) -> [H|truncate(I-1, T)];
+truncate(_I, []) -> [].
+
+mkpad([_|T]) -> [32|mkpad(T)];
+mkpad([]) -> [].
+
+proc_format(Pi) -> %% process_info struct
+ X1 = pformat(lists:keysearch(initial_call, 1, Pi)),
+ X2 = pformat(lists:keysearch(current_function, 1,Pi)),
+ X3 = pformat(lists:keysearch(messages, 1,Pi)),
+ X4 = pformat(lists:keysearch(dictionary,1, Pi)),
+ X5 = pformat(lists:keysearch(heap_size, 1,Pi)),
+ X6 = pformat(lists:keysearch(stack_size, 1,Pi)),
+ X7 = pformat(lists:keysearch(reductions, 1,Pi)),
+ X8 = pformat(lists:keysearch(links, 1,Pi)),
+ X9 = pformat(lists:keysearch(trap_exit, 1,Pi)),
+ lists:flatten([X1, X2, X3, X4, X5,X6,X7,X8,X9]).
+
+
+%% Using the tool_utils function for presenting messages.
+dialog_window(GSParent, Text) ->
+ spawn_link(tool_utils, notify, [GSParent, Text]).
+
+%% Create a window with a dismiss button.
+msg_win(Text) ->
+ spawn_link(fun() -> display_msg_win(Text) end).
+
+display_msg_win(Text) ->
+ GS = gs:start([{kernel,true}]),
+ Font = font(GS),
+ Win = gs:window(GS, [{width,200}, {height,75}, {destroy,true},
+ {title,"Pman Message"}]),
+ Can = gs:canvas(Win, [{width,200}, {height, 75},{x,0},{y,0}]),
+ gs:text(Can, [{text,Text}, {coords,[{10,0}]}, {justify,center}]),
+ Btn = gs:button(Win, [{label,{text,"Dismiss"}}, {font,Font},
+ {width,100}, {x,50}, {y,40}]),
+ gs:config(Win, {map,true}),
+ receive
+ {gs, Btn, click, _, _} ->
+ ok
+ end.
+
+%% Choose default font
+font() ->
+ font(gs:start([{kernel,true}])).
+
+font(GS) ->
+ case gs:read(GS, {choose_font, {screen,[],12}}) of
+ Font when element(1, Font)==screen ->
+ Font;
+ _ ->
+ gs:read(GS, {choose_font, {courier,[],12}})
+ end.
diff --git a/lib/pman/src/pman_win.hrl b/lib/pman/src/pman_win.hrl
new file mode 100644
index 0000000000..8a2778d5b7
--- /dev/null
+++ b/lib/pman/src/pman_win.hrl
@@ -0,0 +1,39 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+
+-define(WIN_HEIGHT, 390).
+-define(WIN_WIDTH, 745).
+
+-define(MENU_HEIGHT, 40).
+-define(CHECKBAR_HEIGHT, 40).
+
+-define(CPIDHIDDENTEXT, "# Hidden: ").
+
+-define(HEADER_COLOUR, blue).
+-define(UNSELECTED_COLOUR, black).
+-define(SELECTED_COLOUR, white).
+
+
+
+
+
+
+
+
+
diff --git a/lib/pman/vsn.mk b/lib/pman/vsn.mk
new file mode 100644
index 0000000000..d190164053
--- /dev/null
+++ b/lib/pman/vsn.mk
@@ -0,0 +1 @@
+PMAN_VSN = 2.7.1