View in color | License | Download script | History | Other scripts by: notchent |
14-Dec 16:30 UTC
[0.105] 36.545k
[0.105] 36.545k
appbuilder.rREBOL [
title: "App Builder" ; GUI Builder, Code Generator and Language Reference!
date: 28-Jan-2016
file: %appbuilder.r
author: Nick Antonaccio
purpose: {
An app builder to help new students learn how to write Rebol code.
To create a user interface for a new app, just point and click any GUI widget
(button, text field, dropdown box, etc.). You'll be prompted to edit the properties
of each added widget, and you can add actions which will run when the user
interacts with the widget. Actions can make use of varied data sources (text
read from a file/URL, selected from another widget, info requested from the user,
etc.). The simple Rebol code used to do all these things is displayed as you add
widgets, actions, and data sources. The builder creates real usable apps, and
provides a completely natural learning process which even children can
understand and operate, without any previous coding experience. It's an intuitive
and fun way to learn how to write practical working code immediately.
http://withoutwritingcode.com ; home of the appbuilder, tutorial and more than
; 70 app examples
http://youtu.be/Gxv2pbXVJDo ; video introduction to the builder
https://youtu.be/dUSNKSQuOEU ; video of building 10 little apps
Note: everything below the 'btn "Console"' line is just documentation and help,
which can be removed from the program completely without affecting its
performance in any way.
}
]
g: copy [] req: func [x y] [request-text/title/default copy x copy y]
run: does [
write %last-edit.r get-face code
if error? er: try [g: load code/text] [alert form er: disarm :er return]
write %r.r rejoin["rebol[] view w: layout" mold g] launch %r.r
]
act: func [/local acts acs ac /f1 /f2][acts: copy {} do acs: [
tl: {Action:} if f1 [tl: {Inner Actions:}] if f2 [tl: {Inner Actions2:}]
if "" = ac: copy any [request-list copy tl reduce [
{alert form source}{set-face FIELD1 source}{write target source}
{write/append target source}{write/binary source}{do source}
{VAR: source}{VAR: do source}{VAR: load blk}{save target blk}
{append blk source}{append TXTLST1/data copy FIELD1/text show TXTLST1}
{append DRAW1/effect/draw source show DRAW1}{poke blk NUM source}
{replace/all blk VAR source}{remove/part find blk source NUM}
{insert (at blk NUM) source}{move/to (find blk source) NUM}{clear blk}
{foreach ITEM blk [ACT/F1]}{foreach [ITEM1 ITEM2] blk [ACT/F1]}
{remove-each ITEM blk [(calculation)]}{repeat counter NUM [ACT/F1]}
{forever [ACT/F1]}{for counter STARTNUM ENDNUM SKIPNUM [ACT/F1]}
{while[(calculation)][ACT/F1]}{if (calculation) [ACT/F1]}
{either (calculation) [ACT/F1][ACT/F2]}{do select blk source}{return}
{FUNCTION1}{FUNCTION2 ARG1}{FIELD1/offset: FIELD1/offset + 5x5}
{set-face PROGRESS1 source}{FIELD1/PROPERTY: source show FIELD1}
{show FIELD1}{focus FIELD1}{clear-fields W}{view/new layout VAR}
trim/lines {parse source [any [thru "START" copy VAR to "END"
(append BLOCKNAME:[] VAR)] to end]} {FUNCTION1: does [ACT/F1]}
{FUNCTION2: func [ARG1] [ACT/F1]}{if error? try [ACT/F1][ACT/F2]}
{attempt[ACT/F1]}{send to-email %NAME--URL source}{make-dir %./FOLDER1/}
{change-dir %./FOLDER1/}{rename %FILE1 %./FILE2}{delete %FILE1}
{editor source}{print source}{prin source}{probe source}{wait NUM}
{browse to-url source}{launch %FILE}{call/show "NOTEPAD.EXE C:\FILE"}
{do load-thru http://URL.com/FILE}{do VAR: rejoin [source VAR2]}{halt}
{quit}{break}{insert snd: open sound:// source wait snd close snd}
{close PORT://} trim/lines {NET-OUT: open/lines
udp://255.255.255.255:9905 set-modes NET-OUT [broadcast: on]}
{NET-IN: open udp://:9905}{insert NET-OUT source}
trim/lines{insert-event-func[e: :event either e/type = 'close[if
request"Really Quit?"[e]][e]]}
]""][either any[f1 f2][return rejoin["["form acts"]"]][return load acts]]
if find ac "ACT/F1"[replace ac "[ACT/F1]" act/f1]
if find ac "ACT/F2"[replace ac "[ACT/F2]" act/f2]
if find ac "source" [replace ac "source" request-list "Source:" [
{"LITERAL"}{VAR}{value}{copy get-face FIELD1}{(CALCULATION)}{false}
{true}{read target}{read/lines target}{load target}{rejoin [VAR VAR2]}
{rejoin [get-face FIELD1 get-face FIELD2]}{load copy AREA1/TEXT}
{0 + random 100}{first random blk}{NUM}{now}{now/time}{request-date}
{request-list "TITLE:" blk}{request-file/ONLY}{request "QUESTION?"}
{request-text/title/default "TITLE:" "DEFAULT TEXT"}{request-color}
{to-TYPE VAR}{to-TYPE rejoin [VAR VAR2]}{to-TYPE value}
{to-TYPE get-face FIELD1}{type? VAR}{as-pair VAR VAR2}{trim STRING}
{newline}{parse VAR ","}{reduce blk}{last blk}{head blk}{pick blk NUM}
{find blk VAR}{index? find blk VAR}{at blk NUM}{select blk VAR}
{reverse copy blk}{extract blk NUM}{extract/index blk NUM COLUMN}
{remove/part blk NUM}{copy/part blk NUM}{copy/part (at blk NUM) NUM}
{sort copy blk}{length? blk}{empty? blk}{index? blk}{copy ""}{copy []}
{ITEM1}{ARG1}{counter}{pick blk counter}{mold VAR}{form VAR}{load VAR}
{do VAR}{copy VAR}{compress VAR}{decompress VAR}{encloak VAR VAR2}
{decloak VAR VAR2}{dehex VAR}{checksum VAR}{ask "TEXT"}{FIELD1/offset}
{FIELD1/PROPERTY}{TXTLST1/PICKED}{read/binary target}{target}
{LAST split-path VAR}{open PORT://}{wait [NET-IN]}
]]
if find ac "calculation" [ms: copy "" do itms: [
if m: request-list ms [
{(to-DECIMAL copy FIELD1/text)}{FIELD1/PROPERTY}{value}{VAR}{VAR:}
{to-TYPE VAR}{type? VAR}{TYPE!}{TYPE?}{"LITERAL"}{now}{now/time}
{now/date}{pi}{true}{false}{+}{-}{*}{/}{**}{//}{not}{=}{<>}{>}{<}
{>=}{<=}{++}{--}{(}{)}{or}{and}{any}{all}{suffix? item}{form}
][append ms rejoin [" " m " "] do itms]
replace ac "calculation" ms
]]
if find ac "target" [replace ac "target" request-list "Target:" [
{%FILE}{clipboard://}{ftp://USER:%PW--URL/FILE}{http://URL.com/FILE}
{pop://USER:%PW--URL--com}{%./}{VAR}{to-url VAR}{value}{to-url value}
{request-file/only}
]]
if find ac "blk" [replace ac "blk" request-list "Block:" [
{VAR}{load VAR}{copy []}{copy ["ITEM1" "ITEM2"]}{load %FILE}{read %./}
{load ftp://USER:%PW--URL/FILE}{copy TXTLST1/data}{load copy AREA1/TEXT}
{AREA1/TEXT}{load VAR}{unique blk}{extract/index VAR NUM COLUMN}
{extract VAR NUM}{intersect blk blk2}{difference blk blk2}
{union blk blk2}{exclude blk blk2}{join blk blk2}{parse blk ""}
{system/locale/months}{system/locale/days}{request-file}
]]
if all [(find ac "random") (not find mold copy g "random/seed")][
insert head g [do [random/seed now]]
]
append acts join ac " " do acs
]]
ls: func[l][t:["ITEM1""ITEM2""ITEM3"]either""= l[t][head insert copy t l]]
ad: func [v] [
w: copy v
append g reduce select [
btn [w/2 'btn w/3 w/4] field [w/2 'field to-integer w/3 w/4 w/5] area
[w/2 'area to-pair w/3 w/4] text [w/2 'text w/3 w/4] at ['at 10x10]
image [w/2 'image to-file w/3 w/4] across ['across]
below ['below] return ['return] box [w/2 'box to-pair w/3 w/4 w/5 w/6]
size ['size 500x300] rotary [w/2 'rotary 'data ls"" w/3] do ['do w/2]
drop [w/2 'drop-down 'data ls"" w/3] key ['key 'keycode [#"a"] w/2]
tl [w/2 'text-list to-pair w/3 'data w/4 w/5] style1 [w/2 'STYLE1 w/3]
style ['style w/2 w/3 w/4 w/5 w/6 w/7] slider [w/2 'slider 100x20 w/3]
progress [w/2 'progress .1 100x20] check [w/2 'check w/3]
draw [w/2 'box black 'effect [draw[circle 25x25 line 10x90 90x30]]]
] w/1
set-face code mold g run
]
slid: to-image layout/tight [slider 100x12]
prgrss: to-image layout/tight [progress 100x12 .1]
view center-face layout [
h3 "Add a widget or layout word to your app:" bar 410 across
info "" [ad reduce ['field to-set-word "FIELD1" 200 copy "" act]]
btn "Button" [
if not txt: req "Button text:" "" [return]
ad reduce ['btn (to-set-word "BTN1") txt act]
]
check [ad reduce ['check (to-set-word "CHECK1") act]]
image logo.gif 80x20 [
if not img: request-file/only [return]
ad reduce ['image (to-set-word "IMAGE1") img act]
]
text "TEXT" [ad reduce ['text (to-set-word "TXT1")"TEXT" act]] return
area 200x60 {Erase or type default text here,^/then press the TAB key.}[
ad reduce ['area (to-set-word "AREA1") 200x100 face/text]
]
text-list 200x60 data ["This is a text-list" "ITEM1" "ITEM2"] [
ms: copy []
do itms: [if m: req "Add line to textlist:" "" [append ms m do itms]]
ad reduce ['tl (to-set-word "TXTLST1") 200x100 ms act]
] return
image slid [ad reduce ['slider (to-set-word "SLIDER1") act]]
rotary 92 data ls "Rotary"[ad reduce['rotary(to-set-word "ROTARY1")act]]
drop-down data ls"DropDown"[ad reduce['drop(to-set-word"DROPDOWN1")act]]
box tan 50x24"Box"[ad reduce['box(to-set-word"BOX1")50x50 tan"TEXT"act]]
text "(Key)" [ad reduce ['key act]] return text "Across" [ad [across]]
text "Below" [ad [below]] text "Return" [ad [return]]
text "At" [ad [at]] text "Size" [ad [size]]
h4 leaf "NewStyle" [ad reduce ['style 'STYLE1 'BOX 50x50 RED "" act]]
text leaf "Style" [ad reduce ['STYLE1 (to-set-word "S1") ""]]
box water 50x24 "draw" [ad reduce ['draw (to-set-word "DRAW1")]]
h4 "DO" red [ad reduce ['do act]]
at 20x172 image prgrss [ad reduce ['progress (to-set-word "PROGRESS1")]]
below bar 410 h3{EDIT THIS CODE (uppercase labels/texts, sizes, etc.):}
code: area wrap 410x200 [
write %last-edit.r get-face code
if error? er: try [g: load code/text] [alert form er: disarm :er]
]
across btn "RUN" [run] btn "Save/Edit" [editor %r.r]
btn "Load" [if request "Erase current app?" [attempt [
code/text: mold g: load find/tail read %r.r "layout" show code
]]][code/text: read %last-edit.r show code]
btn "Console" [write %cns "rebol[] halt" launch %cns wait 1 delete %cns]
btn "APPS" [if error? try [
parse read site: http://re-bol.com/appbuilder/ [any[
thru{<li><a href="}copy link to{">}(append examples:[]link)
]to end]
remove-each ex examples [any[not find ex ".r" not find ex "my"]]
if not example: request-list"Examples:" examples [return]
if request "Erase current app?" [
set-face code mold g: load find/tail read join site example "layout"
]
] [alert "Connection to appbuilder web site failed"]][
set-face code mold g: load find/tail read request-file/only "layout"
]
btn "Ref" [write %rebol-reference.r decompress #{
789C8554CB6EDB3010BCEB2BA6BA3846615836EC34151018688B3E809E9A3E0E
820E0C45C76C685120295B4AD17FEF92546CB54DD18B6C51BBB3B3B3B334E256
2B144E3A2572A49FC2EB7BA19AB4041A236B87344D646D8571337110B59B6DDB
9A233C8A2D448942D2CFDCF58DC03526F7A2471113F75A55F4854E4A8A4B8CD8
EB839809C67790B8D872677370DDF4B087C37CCBB870B3A336959DA260751FEA
38A9EB0D7259263BD5E42812C0CA078117CBAC5B6719B05BE1C7D70F6F70E37A
252C2EDE7DF980A3ACEE84B3D3FC27853BD1B99992D6617195758B75868A3906
3A358CBB50FA20AB998DF9CB50828A1017CF082C32DC6AB3C7434EE74AFC9D75
60AA15A020DE5AB000409A3CCC43370322C0146988EF5AD6486F1AC12553A438
8C6814559A33A58632435EBA392990FA21788C929E25A5B8D6D44842FBE947D6
EBD6E19B4FCAD371C3D9FADCF023E5881D110680B75EFAFFE5FB719DD398034D
604913603998110CAB05A97B990D90AF5AA91CA853B967777E2E5C497EEFFB83
62B7424DA910E3465B9B9409AF5D8E85D7CF0CE690E40C4F386493CA9A72BD8C
A46A387A464EF386DB506C9497358DA82B904B8864D5D2E48A4908A58812A390
B9AE551FE2B8DE37DA52601C4CD0BEF12CA5BD907525BA0DB6F44BAF90D31916
65400964E981E74499F8F8BFD7784928670693A8531816F537FA520CA3DB2DD1
5209A3642D907EF6BB4396875F1EA7C965449BE4F6AF5C57222D93E3B02A05AD
25D74A1B3B3A380B17CD2A0D4DCFF6D689FDC883CCD17BE3C2BEFEBE5FB42D54
3658C30B3AF03D4296E51F79AE6D94F85742E475FE40D924FDB87B42D346DE91
2F562B6F9F68BF81874D47C61EB9709D75143DB858D3A48E28BAFC54262E1F5D
125D7986BFCC02BC47C155865B7F13A5AFA36EA732B6F11B9E7519D1E439B2E4
51C7D0C8633B41BA27DC15B0275B4D3762B89216192E97436AF052F81BBC47E0
FCE41772CBF229B7040A41B183144770BA6A858997908A1B4EC104F60BD38DD6
90B2050000
} launch %rebol-reference.r
]
btn "Docs" [browse to-url request-list "Sites:" [
"http://re-bol.com/short_rebol_examples.r"
"http://re-bol.com/rebol_quick_start.html"
"http://re-bol.com/intro.r"
"http://business-programming.com"
"http://re-bol.com/examples.txt"
"http://rebolforum.com"
]]
btn "HELP" [editor decompress #{
789CAD5C7B73E33692FFDF9F02C7AA2DD915D11A7B32C9C54936ABB13533DAC8
B223C999E47CAE2B4884246648422148CBCAA7BF7E0020286B1EBB77A94D2C82
78341AFDF875A3B96F07B3D970FC564C67FDC96C7025DE0F67EFC4ECDD40F46F
6FC5EBBBE1E86A30B9383ABA2C95AC9490A236AA146951A97229174A1C4BD1D9
A645A2B79DAEE89845A95481BFDEDE0DE18FAA16A72762A94BB1D37529E46623
E63B6154A616555AACC4B2D4B9A8D64A24A9D96472A712B14D9395AA8C389ED7
55A50BD315957AAAC4325559020F49A93731AC56D8597469EC32A742FCAE6BB1
90859099D1F6BDD09B2AD585CC044CAFEB4A6C759918B15DA78BB590CB257659
EB2D11E19696256CB42C65B1027A74C1B4EFED9B772A8E3B72516A6370CB7395
311764E5B67E7A74043475B24CCC614AF301E6ABB4904922FA97B3E1CD78DAB5
94947501BF54A11E6115A4A5594E2E80A46D5A01B9964271BCC8D2C50783B449
C17C8205B1B3616EA5F88258768039B0BA342297C54EC0DCC01C83CFB049B195
4545A7A524D0E41683E742375D2B606F86135E2211446C74A50B15594A681FB0
78919AB54AA05F7F0984E1B278E252146A6BA7EE32671775592A5CB8CEB21DFC
B758D8134371D9A6C03CE04E57C091566B587D67F7512953F51C879841694564
69A3EC79A25C323D095048438088AE9045224AB50191A68E9B522F9431705AD7
21574AF5679DA22C88ABFEAC2FA6377793CB01ACF00639F424F34DA6BA225D36
ACC3B3CD54093CDB8094D69B13203A577C2495F6E7DAA55F06F60E82B4D07596
A07850D72CC5FD643C04E7AD761B8572C0A3173A8125358B08F5691487CE1CD4
CE33379195843DC884D50C05020996E26E32F293989DA9542E40A036732D4B90
974799D5CA58F581794161BD40DA897877C41FE0A82E59C884788F9C7607CD4C
A433166BF9086C2C401937BAACEA22AD76C8105EA3A79294CF812866BE1C9B93
165F617958E035CCB245F524497894652AE7996AE9B4138FC51AF5571CC3D84C
826A360B10A3B672C793A478CE0BBD2AD2BF682EE80F539C74C90A5CF66F87B3
FE68F85F832B587DC074A278D194A437855209AB75A996A8BC9A0EC1D92BE4B9
2864AE4CD7D36B2D56778F9252E520B0AC897A09DB81365244A61FE4B5540614
056C637AAA4EBBDC63932AE6160C490B50DE5C22E3597140AC5080122B412830
3041B9F3E4D1142073395BBD2C35951325B4B4822CED5C3F7DC4C6D2C9E1B674
6D508B3620FC2908CFBE0DC12D815C5C0861D2BF4006173A43A9A99E404CD35C
AE14CF4FD692663720305DD67B5C833536D320CBCE9118100994333C56EB2A84
55E7B986C71C1942124E961A85672712B594755675BD326127EF9A4014640D23
81810B89B608A9489CE6E249E2418A4E795AA28107530D2797420B6E8FC9248A
35593B1C470669C81662514AB30E758E6D7A2154596AB4F5D61A928AFF511B14
086068414380BC799D66091A8F45637747C091C87B00E411CD916B1ABD40AB0A
C4D2E668B74E284A85BC24EB4C420DFF2393085E48AE645A04E7DCACD6C1AE1D
BF5A85CACE6FA329EA77DF445DD26A7C701C239B4836DFF16F5F86688F6876D5
534AE699CF82F78D5C454941EA685EA4D4E0A69E595E920E783D974091B79804
399873205E47E39BD900D04C9FB50C2476053A65DDEB5E775A935E644A960512
3651739D914543978E9A4F0BE36B21E7882E700EF2AC646950F73CD62815CD5C
35B46560A16A8946EABA3FFE1D4E8D0D5B819BA723D4D00B2522CF41A1895899
E748881B694E9CD52D5555A6EA115F5A034EB63AB0A88E90B5067F63A077B132
A42368158E439B75D82F9001E8A221169D4AC73FE0E6FEDE412EF5407C3BC8FE
8EF7DE0619B3D0C5237A439A8F1674B4C1CB670C428198939F2103A4B02B9932
8318A28483C81528261F098C56A687CA67D09A80FD4F0BC4A71B9922201CDEA2
06E2D1F2FBCCC3C42E6AB9922605F5066B85F652C1E680C16A47BE40D705DA73
3666D9AE8BDEB247926C69B774068E15E504E8AB5057B55B8650879B45B05D46
DBEAF7EDE643C1C04DC32E67C0A80F8A5C2352519A0AE646B6E120E6159048CE
82A60F66700490E9DE4830C38B3A93A55DB867764525C18A93044327902B300E
40D887426F0D2360ED18825A008483B3AAD04AE69BBAE283F07A92EFA3A06FE2
A59AC7E72FCEBE15B138FF36CEE52E3EFBEEDB733B1C8F1CF656D4F91C041A84
2E913B035CACB6CA1AB8733A52BBA3AE383F7F7AF9354C75F6F2E9FC65330958
76D6D3273676087F804728DCEDC9F644C2CFCB386586ECEFAC55B611D17F441D
676C983920B5461350229008A7DCBC4BF4C2342A4F0ACB7A6F398767D562982E
AC8302C58F61193B8D977D24A6519496E160CBF967AD516AACFA5875652D249B
8CAB366A8726EEED603C98F4476232787D3312EF06A35B0CDF1A2B3E4198A280
67CE94E342E8A4891FEC94B2EC10D96E15C65B5D1255742B818A913337CCBB34
47B087D619605E4EC005E8FF757805A00CB118FB623B37DA1FB639EDD0A273C9
C71112CB1EE379BCD03A3F101E6067B5268702D490BBE6C70D046C29623DBF33
ABD372816180A2132F555B507EC04DFF1DC33B7A348F8FCD6FA27BEFF187DE46
566B1C80AB772CDAFFC191FBF74E88EAADC4C1B37ADA642856790D26D1A14022
87545F93C25AA123DADBDCBA02010D59F5981A7089F02F227A9C129CE7BAAA36
17BDDE1CF1136C370E1CCBE9C2DA33DBA7C41540C4EA1CDF90512B9587D810E3
254C68A22098420C03725AD3FE78DBC40F3292E8C418F7E70A8D00065B47FDAB
5FFBE3CBC195B89B0E26D38B06FE59038D28AA395F1B34C0191A31BC1A606082
F0C081C00E8681C46B99047EC8EAB6DDA48557D86DBE73A10AE9711339A152FE
13F1D75267994D0DB0FD847D82A3803D4A8B9243184970C5419825849635F81F
DCE5116BE2702C5E89EBE1F86E3698A2708A5F6A3C3616C09183023300A06078
33340B10EDDCA134BE479D44DFD00774F29AD109306BD6C285281E4B40BAC8B6
47996614CC80ECF8938C5158E0187ACD985EFFF6D6A67800252254AD3AC60AD7
D9AB17100E808088E3B3173FCF29BE700A9650DEA70273BB8B61BB3B0A131000
60C2E3CAFE7646034FDF12B1DD6E4F49A4880E37287E4CD5F6745DE599272143
504650E80CE46525E7BB0AD57192AED655CC98138F309A206035A29FE4986EC0
73D16544C01B4E09AC18CEC7BF3828021E15BA226BBA40EF67237C0000A0320E
50DAB10EEDA151B62928E0288704361D139DC26A3EC283D3070F6C7CF0A59ED4
02BC16BBEA14AC5FBA60126803E0F0037947101E7097E62728BF948F200F958D
F6190E8BE33138858D4CBEFAAA2B66D00E1EDE465027A05459A54AF47C085E9C
AA22B2B7FB09C2076B5B23A28CB56223C178118A28D8B83B1F0FACBC29D9F1D0
44704A0ECEB668C374C16E833AD0B12D0560AB8E8BCDACAD83D96E4B3E6425DE
BC2257D282FC3E90F07149C1EA0EDC47B26C1491E8A2533112C70E0C985F9609
412034173A23AB09C6FB0373D519CD560C92947215C34A3105BDED134737B327
FCDA596E07A780E3109C57CA462A36EC4C375590BF020754A088D9310609B7A2
C669321808161503CFE6DC080874128D2834F0187B4885CD32746178A89CBE61
24BAE45F5B352737E0703145A9B4BF4C2F5839608FD291EDB29E6B80FEC09DF4
5181B48249CAE507B77A3B54E648B5E5CFC208199D500547629CFC4560D94079
905B60AAD70A9B6E700E80131F2A3C043BA2DE4468447FFCF1C7B7AA22DB3AC5
66A7846F4BB981F0010D6509BA6ED3B360B430030DAE104313FC018A31207298
78E70E9828A7CF6B407B1027826C522807CC440BE8D30A6A9516858561BC37CB
ADE3E7D282727262E37ECC9C83BD16F00F593F71FF707474E3F2D2555A6556BD
911B2CC298C9B186D8A7272C48498B4556278DFFF144FB489E835BA33002AFDA
0BD36FC16B5E88E87A873E2512B61921F805FC7D15FF210B42F3F60592032FA2
19B1015C23D2832C88A8036CA7EF75869C26A77A8DCAD318A12199BD745580A3
25C7CB87704C888413D6E07644074102E0C40E0A124187750DC1B4098221C243
607A569ACEA1089D303A1FA4E67B3E3A9AD2CE08C0144705141CD45E70D5D4B4
968612EB16FD26E08FF19E6041AA2A3A006189443E59B1B222D8BE2100118C40
04239B8506C18F381385599208613BFEB0A12F1814090B7DEECA63AE9F5470DD
1140168A0101D463EE9B24C3FC5953C6A194E06AF03D25E1292B4EC9D2089DAE
BD13896CE8D91C1D5939DE9EA16B079B480F88C5F6FD842209B0BB91B08217AC
23EEB9D7BC2A4062AE01FCA79BACB976E16C282F650750AA17BC09DB984D067C
A51B1903DE0F41188C49F0DE2361A862DD38B579873FBE99793F7F01243DA7CA
0A3990657F1199F63790209DD6C076634C913AADC060C70DD64F4E89DC71D967
326ECF7AE15C4E77C29B992089EAF03A477CADC4E952173627CAE1A20EA0EB04
4356364F98D845767116194D19A90B66405CE06EDD1523040F67D176D0204BCE
AE7DCFC0C92B64DEA1436ED80908838C7DAEA290B3E2FCC50B11916BA338EBF4
340A982DBE7EF1E2E90C7A6C41AFB8DB51EE64858EF9686F943F173F94B8721F
E1FECF22417FCFEDDF97D143787CE0FE56FA74952E9B131268225EBD7802001C
91B5D04FD1FED98A2F5E857DDB4EA16A05F4C2ACC0083CC7184F569C7F2DA279
BAA277DEA88619EB50D1AD22A09F458809DE19B483AE1F055E73C9829D082A8A
4B7EDFB93B31D2FEE0D6120C5F5D16CDFDE5A98DA1D80ACB8432D1CD813BEF02
87218DFAE2E327B3BC4CC1888BF3D6569E51DD45EB6C77FD6542D3BF9CDC4CA7
BC82B76007D8C57B0EEE0442A13BFFF785EEFC5F11BAC96076371913B19814C7
A96D2A1D5596F313CD2E561AEDEF47E83E28BFFF8684BE1E8C6EDE8BCFF3EFB9
80D15DC117294E6804FB3371FECD8BA7F3972F3EAA09AFD35584F4403FB1499F
F0AA4D3FA26CE0206F5B414342B1161D53ED3053D4B866BE7920A1C15C8ABD18
653F4649500CCB6C7AC0995D84C1E16D841B45BE2D490C4D19F4A76B9E4F2802
1125F21D3288FECD6A85874332130D3B78A14A6DC82EE125838775685CC74EC5
93ECFDF3BD78695FB833F37ED2E2715BABC07485533DFB8D40EE4B8B1386E3D9
60023DA7EDE204D25F46222E33239B54CC1E2C21E0911A97B0A2CB73D32C6127
CE215E4151F7341098B351F4979BA07BBE9B8FDEA556F41F28A499AB05DEBCC3
892ED3458A5766A98F950FDEF4D864B94DC19A204DDA4E908A639B772CAA9AF0
0BE379F05136731CF43DB1DB60122909CF19436A35AA8AA9EAE4CD7030BA3A0B
5F6D3939204BCCE0EEB763AA47A183FFC8EB39849B18C534EDBFF62717CF9E21
FCDC6FA204CF3C6395E60B3F5EC3B5D995E1311C6B5B67BFCD46D3D9598FCCD3
426F7676633DB20706196CBBD8D88524BA8749199C102808272D550EC6A18711
3FA7249B45C5F8EE9AFA005EA5BA0C491462F34938054D00677ABC37FEC44FB0
D110F8DAA1E1C805CA84DF351C1CC1A6E16C707D46DDEF41437A6FCE1E5AAFEF
F93DFEF7FCE179375B99B2D0350613B4E2B369500DF61BFD08AAE5C26183F115
FE99FE3CBC7D360BE876A6EE8F015AE34D118AE2C98FC8DA8756AF74295A5D04
F569CFA452F206CFA7F2DDF8EF39774F7C6DD69E74BCB91B93E1396B3D9D8BFE
E4AD6D6229D1CB2568C445FB517C255E3DBD6AABCBEDE4E6ED64309DB634C68E
8277B783C9ECF70B162794397EC353EC3D2FF5A2366103DA9B5ED1D81C9884E5
4496C6D7F6DCA323B9AFD6652D223A9388A51D5704698BE0789C833CB6AAF17A
7473F9F3B87F3DB8B87FC07E270F742B50240F6D16A15682F3699D83E7D80559
2278098C7B10FBE749F5063F098CDA0E9E0FDE53E69BAA35CC9019D1B1CA659A
09A4EF1F986E0A55487E50719296E26FA7BD373798523EEBB1865021CEC15725
1754FCEDCD703438A3B7F0E39C850424A472AF58CA382F182CB92921DA6E37E8
B90A1BE62544DE789316D76516BEC824669D787AA6128C4B8F4E3DC21A81DBFE
D5E9E0B781B8BCF86FECC2A7B49569B56F510CDE175F70FA8B7FF77AEEF8A93F
350A0ACCF9F7478ACC8212B3E9FEED2A5F6FA06B68AEFA9CB33C5861467E15D3
56D86EF3466121908BF3F0B6099C5E45E103DF9FD2852344D29F2B1C0B2A036C
1D984A9A7A4E2E735B69BA93B6B3E4126F8E3963185CEF733EE3736E7C02BE14
6619A90AAB1CBD332FB93992F305C40C2B8F6969CC586F7D4772A985DEB63A5C
034562E02969777E0516E5DB56F74BB7E566796492E7041C7DABFF7B351753F0
B3EDEEE1D51ADE83782C32A2322F948D26B1E3B115E25B46E79CBF92E2F26674
33B637AD55AB7A429AFD6A3AF20E986120D1F904AFD9C25DB43220B4977EE62A
39385339078FE9F715786FBF9B778AAA680983FB6B7F2A8FC1CA165BD3D22A4F
C1B0D2212DBC8CB5D5785CF987F9C5A01A8F191294C449AE92EB353581615109
DB202EBEF5D7043485ADBCF3F3903A190D9BA22A854AF6A874A0A7E77F80C7EA
1E4EAE46A32162E151245AFF7C2F225BCF1935659EB8BEBDD4E7C48EE30F6916
51E6609638F0CFF75CCA60B5198CAAA28BACB65A07456D7CD23884CD1CBA9F55
1B4ED28BCBFEE8F26ED447F7614DB374B8D13FF7F83E30682518D8EAF587061C
7C8FC4C3BFD6A15825C578E72BF182FD29A502EC0B879E9C692D6CA604FE5289
8F9D9A8C0C87DCD16C381B0D2E223FD4BD4596F628BBDD73F505BE6F743578D3
BF1BCDC46CF0DB2C6A0DA3B45AAB054D5E4F17D9AED58A09F2B04144BFDC0DA6
C8B49F7842F034B3DF6F071E0EE031FDE49FA489A91AC5B187BB94690E886D32
1CBF0D10047689BA8ECAA45E28BFD74C9A066763F6DF3F6C30D4B120D5B2D9C2
594701E6469F7E7ADE6E71B17B0CF0996B22C869144B905B10B84DD5D7E19AB6
AD474B79C80CD6EAEEDA895683D7C38138F3A75A5BE0DDBD26556DD194A96255
AD7F6A68042CB36B1E2D07DC638EC907B747B2FBEE8164DB3D0066753F1D82B3
0FF986EE317D47F5AC898261F9A17DEAD0EF79A3C529CD5C6BE0A05F0A5328A6
CE0369FA00C2ED65D91A6197B1A5361768DD0E2F7F1E5C358A6C03BF4073839F
1E6E539462B74981455BC85CE3912D4094584CD143B6B992351F407335E312C1
4013369389B1C6DF1AD2008F054E95059DDD264090D3CB9BEBDE6DFFEDE014B6
C7E7C6AFA683C9C56D7F3AFD87EBB4A9E7006FFE074B0B2CF02484E9C7012787
FDD7A341FCFE667215BF7F37BC7C17DFDE0CC7B3693CBB89FBF164D0BF8A1993
1D1D0D7D56004D10E589B870DA5D0BCD330D07C4578E007F5205BFD101DA0B13
7B63793009625DBFA0299CCF6F95B78B6320F6ECA47B080458E65DFF8E0736BD
10F7119D1C583C8A30ED5F4CF851CD48C786A101964C0D2307ACCBD4E4033913
59E91E11135C27D02D0DD3693DA45D3E8C7D1D2D0E20E003ACFE6BBB60DF555D
B9AB43BA2D5D6B4D0E7F4632726E6B50126DEB6BD0DA180C1A6C6597B1057FDC
8D6089A527FF1423428253913B3AD310B81014B0A0C5E2150755A0955910EC9F
ECC2FD43F0FB93AB73973320FDE543636F1A05A0C74F093DA90FC44C4DEF673A
C395683DBCE1076F061BA8D6E6C00B2CC66C6EA1ECFDB24B028AE1788AD5567D
0E4D1970AED247FB0D06B3C1A22F38367FABE7BF17FA7FB8C2C39A9DE60A8FF1
CACDDD7876E171AB4DEDDD14FEA6C9B6CCB67ABF655D2AE5AF5806B648279069
4739497E27D11DBB24C820AD7A74D47FDED9CA722E1302ADAD94A9FCC8D75C0D
CCFF6C12134D2DC06D478247D9FDF6F2E10DB0A4A224B04B4ECB3B4C7590D535
61890615E8CA46E443E3C026AECD7A4E313CFC9F8FE08B36DEDEF58CAAECF1C2
1C380C301C490E2AFE4CFB4331BC56ED807BABB9B6E0B8838297E37D7FE72428
4877D1932D0E70F3D94D4FFBBF5FF7C7B349DF6DFCF6DDA43F1DEC6F9F5BFF85
A6CFEC7FC2A9C05C1600AA800F4C035812217308AF750247AEEBD5BA8B356D1A
0C223FE23D95E7162A36168D065514DC2BF86681EB1EFC0709AD02F426AEE05B
15CFA2A690B0D1902F2E3704D5935CE25AB54A0FE8D39ECFD52D8A2D187E474D
F8F186FBD4E3D0F72BD194AA758CFF5031DDFFB6C67D4662BFE3214E3D019A4A
5172781DF218BA400F35ADEA841891FB6B75706B3C8BFBB284AF66F9DEA05058
5D8CB80B10C1420125CE53EDE235DE0FC7E016B3E42C8E29B1755A1E78791EC7
2442075FBEB42F6312EA835DBE8E63971D8D29C66F7AD91BFE188DC1C1B1AFE2
98AE0D0EBEFCA6599B7D3C362707BB7E1BC7FEF2F46087FF8C637F8D79B0C377
71EC62D8CFF43C7B0174713EF38B879C318FE6FA296EAEF90E7785E3E090B779
6DB2140570EFF9BC6928B876B369D8AA3984852B15738633185AE9CD56568B75
D344163C6ECA90B1E6DFBFA40BE158D147CD01C1954E74F3E44142BC2AE57CAE
CA18AF6F8255110DC4361B184C926E6297DF0F69E4109E252E5873013C8997B0
D481261023D024A6361882E9C1187CFC5FE1907C9391F2C1E115AA6C2F4D8172
3CBC8D6D496330EE00A1E932B6F9D438CE357DCF0547A18B982AA3F057D37755
635D3C68B6DB1E6768E2950C5583AF3D9A5937D218147A64469AEC9D4DBB33C8
0D85732A896DF5A34A5C4F0B4B3F76C8EE3556ABF245519C6990673B7378EEC0
B980018BB52CF170D9BA002DAD714DBFEFBE8BF1034A982AD64B1084D61CA0E3
4522C3160C6E5AE2863704E198392C8B6B576197244BE72DD282B7CEF33E278D
224E545CBFB73DB40E10F283E1EF1E12A5DD976541D5BEBBBC2583CFBEE680FB
10C75C15ACB0BE738E5E0987D1777DD65FB197C268834A8B4F2EC45118A5A223
AF4FE7AAF7F6E9F17C33FFEDD77F5E69FFDE841D92BBE9F8E7E92FF5CDE0EEE8
68A4EDD746EE30BBAE2C0BBFBD404B406FC1B5CD6A802B769320767A9136AE90
5C14108889795B07E19A9EBBBCA0028C6A7BC9D753B6D4702E953195A9572BE5
BE0DA6D968F1EE1E5270FF4F0A2E0BE9D775A11ED6A6F3241B84C27415B00583
C30EBB04482333FBED1CA60E80BDF4E1BEC52B342D11CE8519CF3FDAECDAAF64
82FC71A9F88B93F62797FCA14A5DAAAEFBB603E9CF957405BEEE1B2807F08F3D
C03C690AEFFC97950AEBFD99482CC6A34B795FC9EF401695B43602E43F343DA6
1758AF9A212F82EF37E83B6A82E81E8D0729DFC345AC5819DAAF18026FC0E656
3E0B133025A0D0957A835AF94F886DEFA026A2D9DCFE71FB0F602DC338B9DEC0
71ECE83E8771BB6FC3CD6EF029B7FB989C0A6429CE761F191093A808C7B327D1
0B02F56C228FFE1749766DFECB440000}
]
] Notes
|