Welcome to TiddlyWiki created by Jeremy Ruston; Copyright © 2004-2007 Jeremy Ruston, Copyright © 2007-2011 UnaMesa Association
Encrypted(DADE408D4762472229A714D95373C6E3FFD682A7)
396452bd42c8d7ba11c240302003c7213921d4c7e4a87ba6195964d61ba3472130
217ced91b6db5f66ed584f818d90f1402302f1213333213d0efab0e7a5a183c7
f7cbd9e983d9e7d196b28f85e7de309763d88a053d9b7574f92eceaf61412b74
2b9a19e9af3239c5a1b58c02c7d4e868a769f2caf8724a5576f64b73a1f0918e
ed8784c4b93857fcf19d5a767edf842ed4ce46e89d553f4221313221cd4de39c
e4541216c7b5c1c20ecf4d1225b3ec046f6a25118cf60847013fb64b29414bea
b1d9f55ba183bb51eae4e140ed4950ed10b844edfd330318ce8edc2b70f1871e
1d991c5b7a18eab0942d1f368cc5d468add4da07ad2a1837357f5c2131322197
7b415fd286213021c698c8c12da4ad79213136302114ff892133332163065535
6f2ef6a98a56b99cbe4f0f213334215b29633697ef072d64daf73d76f20796e9
c78b78944021313021fd34b8dbd2b9563e818e5ab7f3454dc536ca93901969fa
6e7302dd4c04bd825204e54a54359196fc9e3bbdb0c3ec3c614b07695331e9bd
24e61421333421cfacc7d20ffc1d3ab0e3bccdd38f57806eaebcd1a821313121
986b1c62232c9c9e6f640f64287d7a2f37cdf4f059fce7b902b9a51c875003af
efb0047783a72df1b64d5ba3c321313021d9edb2557ffd235290a88532e4a295
778ee36421333321689321313021419a44cc64fb7138252c92afe4a8491f42c3
85977ff23d6c413659dca1be392f7628f67e339cea5bf52131312131ef471621
333921334846261ccd21313021e1bd7f21313121a72a5dc7c924beff21313121
1408587e21313021614d18d0fce718779aa276d067486d481f329594f454b702
c13ef69266afbba9156f2d71a4c9f317ccba23415621392156f133e42ff92a43
24b4259244b4c921333321202b52eb51a23eff984b8a02bc24b23b5579f67926
0826702131312132d5bbb1f71c2c858b9feb3f9e4168837d78302131312119ee
1d6be4dd7a2f1f1b4e2a3cb06dfbc8fc1f1390402dea94aa7eba5f5b4eed4701
d935f228f0a5187b2133332121313630214c185d8021313221c72e21333421de
26e63c6dae0fcee44846538185d5c4ff6a1f198ba33a8afb06dac8ea2c31afbc
9e9ead57d71a3612c54878599e8a053f94747dede76214bb8dfec492e6e50519
de8221333921e3aa646b6312bfb2b27c1cc069d6c9bb19a656083a497026d31c
7b64cf772b3421333321d0e8bc501438288831ca73a72cd6552b91455ec12133
34215fae3b16748ddf46d36990ba25bb638c44213339217ac1edad663883f98e
79def73cbf8713a14648c4b191eff38706378b727dbb235601e1dfe1afa84da9
626c248e9e4a704c5aba87a4e588b6e25d185b65ea0fbbc4cb92a274751b198e
4acbf321313321bbf89dca7cfe13f158c9ce02674f75f69b4b5446255bd415ca
63d06d07c923e552addd34a404401413d1066bcb3736a5213132219b18cb77a8
2131302117b3faa525c172358c8ea1ce3c69c1213130211424a4a26e61d92131
322166ffec660114e6ca86dd4c796d21333321433e54
Encrypted(66FE162AB5D6AA3BCFA163E0528F77FAC5C3B445)
57833ec74d1fdf6b9ef68cbab9c1714fc1ff0567b9f57a304f36a3ffca85922f33
65e1cfc99ab33bd820ac624db375d62fbaa54df24fdbcc2603bad9ba2d9b7daf
f568f5c2252c03854e72c1cae11d21333921976f8bab1fd72139218f16213333
2174df0e7f54c3a2547e14a2512131332173911968e5657d39f99f21313321d9
2130211ac5a9fc687ce6cca4b808b3a9401b75cde12c11185cba2edbac5c082e
41e49d300f0eaf903075c8522f507dc9dd7561cabe5ee392167c8fc7d8c7fd9e
3a03de887f06758a1b669b12a45dcde714c5a5bad1cfd23d3ac629e1ff66fd3e
21333421e4fa6eea9f0e8760168edc0f191d6874374a6f072996c068ecf1fbd0
a15df75fb8747d9afb6c513a1121313630217969ba012e75f07db6c86c2cdd76
cfba8614b089d6aa378eef50213136302145e004fb55e03c031993888dc3b436
c639213136302121313321a2efcbfe74903310c001c39e8be173bd85bad4b436
c02139218bb521313221e5213021a7e1bb4db677aee1d22d5af65e2cb42f3324
4254ed5d213334218c4e4e4359df8d2dc88d40768cc0e355fb256d7b21333921
dd1e075a50a5a1dfb360c6213334216d538d5d2131302130c92a9e9e6508a340
ef1171b626213136302141601918e0f8561fa933f58d517ab09b058314e665b7
9e45e97baa16cd7e1a37d1caca3eb47a3bbb7d7f840f0e3261f34795a8f49aea
d68a515e99e0c80899eba8ef16841138848ac6b93c4a778edc7266ffc0cd3951
a14e869e4ebb2b5159bd9b5b537a8ac420f5d0aa934d8e7913c76fe8e63d7f84
b7ddb7ea139a1f9a3d7cffa5be2a2e31263d6f4058771587386f21333421da21
3339213318af5b20d779f35a47d0d00487303cc859e821313021b6f86eca8cf5
ee3b21313221dbfd511c6239213333212131322120fd10bd417724cc3167cb46
a48411eb3995d584a98f68ccf8f8b40288859c99877955e54f3d565c3c516d20
a1efdb79e8b021313221ed1839f62528a2f69cb90ec53f6d9bfa82872130215d
787f288fcb35b41541d9e8f650ce2d034e9f614636f9aa1969d55159533061f1
239d78fe2e6ad4d53731edcfa84fedd3d253015cc921333421e8e0ceaf6382c1
cffafe075476ef9cf64162fd3b322a7db86fec1a688e73a9cd694454a4168d81
f923613f5a213339210fb7e9b51521333321e91a7cdc374f93b0387207213333
21b5ccb2bc8e3adae783f021333321805344c48e043696fa6d2133392112b36d
28709e213130216c3d180feb64963ec7e7879b0839b4971438af8a71eaeb3760
01c546598c0e3cce08ca6ee2bb064affacb226a6e323ba21333321de71da17b4
df2133392111762863a85e2cfd505120551b7be9f01dcdf8405a93f1573c7bd2
be599ed116bcdbfe9318b89f43d20360563fc0cbdef1
>Does the formula imply a given clause?
>Is the formula satisfiable?
>Are two formula's logically equivalent?
>Is the formula implied by a given term?
>How many satisfying assignments are there?
>What are the satisfying assignments of the formula?
>Does one formula imply the other?
>Does the formula evaluate to //True// under all variable assignments? (ie. tautology)
Encrypted(776C7B1AD8677BB74A03CA62F7A241C8BDEB148A)
45b97d08a6074a8796ee2f476cf4c5b1970ff97d9db62b87aa4b2133332152dd6c
a12bb88579362882feb6eb435586cc444d8975535fbb7ec8eae0513355213131
21e9c7440fda1334d98023ec58cd7017671a62a63db9fad23021333421bffd17
a2f43d7e94f2a3b632ef7ec82131302150293a975a70cd70512c54abc9213021
cc864f4dacb91673313acb529106142d4eaac05e98afedb42f599aad7eda9f21
313121e8f7b2157934794937416a6e42c8a36b5773f87f9911154a7aff883b06
83d333a81d90884744e998796eb73c21333921c804e8926b5bc9b402dc2e5129
5cf145edce213021499ebdf848bb8b9621333421315c402130218147dd031a7f
b3de213133215ecb4b6f213921f3dae0c696d8be901ec1a852ae6bb0a4023675
ddb24c4f2e15433e7d0f5d2131363021d9429e4fef7ec4f5134486b292bddafd
cde2f416e51dca58213130211d91e7c37a80bca86de88fb16bb5341da8586194
19aaf4c4d17191e90fe32131363021842c304013f6932421333421eb8e75ab63
494a47fbf023b2b235282de4371fb403be1d5bdf80adfe282429fb5a498140ea
c7f4102139212b5fb6d66f080387c785a6823b213339219b213921d9a36a16eb
8b5054bd6c52903902a66ff6da1c539199f19d347eb36097bc53dc2f91ae2131
33217ed78ae5e446bbe6646e984a2a69b3f8213021f88151b138e053ccf9ec19
e136ec5ecfc06ff49149712983ac15b940d342041a0715d4af02844e60eaad24
5b671f365723cd61c615c580e85d505ef4c8e821313121294749dee27eece959
dd1a3ed4bd559230c3372131322129670473022a23be7d90722621313121e851
a6429e4585bbbcd05da20f31ef434288447f87bb58ce0667e421333321df2a3c
4c49ebd33be3bc5e7fcc7b23baa76ee95d46a7ad6f642139214684d2b873f621
31332103c3d5f095c658fe0121313021c6c5a976c699033fac97293324bcd112
2fe4be8e047c85be45e634f5acc0e44c3501a376c446bec6e1b48cd54053afaf
d836d7cff81bad772eff6a8a692d213132212f725557d56739213921fbb003fb
8654adf429cf92343d213021ebe5886621333321cecbf4dff7c092cf94d28c60
7782acd8fce02fa6984187047be0dc31d4213130214416b248ed33a150c7e680
59bbae64b07cc912839664cc7fece95dac6074aaadfe014658fd5991cf447898
10a75f21333421295e6674cc9aef785e06c5deaf2131302194f0f4f2848605b5
bf74a6dc9038ed88158b806d9c89bc44334d98c1781f944463c0682133392115
94fd40fd9cc977ec7b789b3588213333218b377f6710f321302103b624ee8bfa
d36512f9c8d080c329a283dc9f6db0578669eda5a2eeff48ffea2bc0bfd3cf08
2131312135fdd13e792801
Encrypted(5908DED5BBB670DC96F129E606C17C935B83C730)
18821eb1de7061595e2e0671cf8e2a7b43b458cb39605e64896eb56e8035927135
aa6874e8d9ce0edf12b4125670a2a9405eda9a1d33ca5e04ee3f6bcf3c7766cf
d32d7545641e88a2af6eb87fcd81a8e6d57da7d252a4193e127aabceacac505d
f0ad3f48e9a69a5141f321392163836c08394397d9f3c804b77b80f87ea1cfa6
56024c4134cb7413513a21313321ed3c1621313121ef35fc344e6968583357f7
91c61033bcc47456923fd6ad2cd62faf3b8c8981dd52ef53a63f86aa791f783d
78410350f151392133342155369eb52e23dc244f3179cfc07f1997cba3184712
2d7acc40c7c81b213131216ee9cabd16f5406f6f66c78ba6ef2f4548e55db421
3021d70e9f2db1ead8714dd25dad072ef61e148b4d03e832c016685d3b71134d
53cd68e63e4ce807ac67d0d06f9b751eed0718a8ff233bee6f9fb42ac9371eee
cd70735e2dcf745a379ed37bcdf77e459b2131332129ec5ba7d8a2f82d213921
f43e3edf5b3ab84379ca189bac491535f321333421a14eecb3debeefb3cf4844
baba47ce2133342121313630215777caa9ffa3d3e57ddd64900656a82b7e1c03
29aa3bd207e13d213339211fafc2aa73ca97d91ecfc49ee0c77e65e13804fc21
33392136b5f160e721333921ee8de51a3621313021870f2449b01f3421333421
fec6213136302185e6d86d28b67860a2e1fe78ae213921797694f596fbe7ff84
2130215f2f6f66b2f9c53b7a203793426337bbcb33684375eaa4fbf96dff70e1
04e93021313021e4b34b7e72fdc9c3f6be3ab83683e5a5ea02c45f4c60213130
21067465c52131363021ad0228653c1c4f6c5e7c2a5d0fa6b9e6fe493087bfcd
f450cfcbcb2131363021d98b1ea94f72a40453c3e2bee91e76d342da35b66f12
9fb41c1b5925d82042f732d5c920705cd2e311dc35335acc608e5c94867eb7d3
94c09da39c77715fbe64ce607e5c8d1ce530be8c76e83823b208898b4878b3ed
57462fdc737721313021ecc9f7b8f53bd3fbff291a1004df6637da57e548564e
79cf384619072494213921068adfc15efe3ea4a821313321df829105b72ae724
ab8228d2f120deeaa9872b961afc87
Encrypted(55AF5AE03DDC4701178AF0B0E7ACC13A6498A4B3)
c4e450a6f3fcd821333921abf5bb21313021658dfc13a815b39a736a3a5d39e253
9601fa213339216462b44718464f4a1af92d98e2efe576b77b1a213131215878
7e4c39
Encrypted(54AAE5221FA4EE63418FEFB1DE721718C3B4E188)
c99fdb2d54b2ac2c487526329dc1d0169740d3f095fd559b306cf221333921b08b
e42d182130216923b74677f7c594515a9645dddd
Encrypted(998A724ACDB540D622C82B18FCD9199A2B2CCC4C)
e5a44315c8707028dec32dd884981c2484485e9ab54c5df9ac85cacf9f6774c297
383b91159b41f340b1cda88d5db8d877853096686b055f0188981df82d751472
85078c1952a64fff6d667194c48ece9241213130214976b3287c506b0465571e
5d39a5474d88507e6031efdb15c62131332171590593f0b09aa21f867dca4bb1
3f7a2c1b9156bf183d521e9bfa86537b30bd712aa74fbf8a01cd1e21313021aa
213333219313e577e518a2c3a62890d9be03cad1972a21302159622a83f7e3e6
199a665836a8213136302199776e687197b42f91ccc2e85ba96e38bb35c4a8fb
35849de85161265974374ad53aba4e4fa64c30266de23319b52133392166b792
d4c1a38d0f558f2338bad40313ef2d029e332c41c5ba4383462ae104dd4f10c9
b7aaa1dcf6ab2133332199f804e5e253581273a369e9068dca5f9d4c2130212b
e48795fd3ca129073e78d6e663a6772ea373b48b53a170db4bd9e4bd12b48ebc
3a87f7699e5f8e10d6a40e638ba36254c725f3b9c6b2622131363021b9655ca2
4a7a105d51e862cc568a2b61952dfad686d5ed9975470f6364e11062adc530ca
d3fbb2d0f475e537d9a1049870fbb7478e0552d760aed4d2113c3404745ba92a
67135ff5437a21313321e218f14148304c4fac543ea3f5e28d4ab1db752bafcd
16dbd2a8b929ec2395f5628117813cba2541abebefebbead9d31cfdcafa8231c
213333217f347e01374da207712131312133a5f52598776ec7d2f5311577495c
283cfcbbe6249712be2e41f2484468fe413a8ae2304c6546677db87921333321
87f63f70d80eeb335bb85e99a2231dcc47e495ad1e85f0213921fc6a6d90d5f9
21313221e4ada2213334213bac21313630212fd515841e2133392141e09d431f
a95fb7213021b44bccdeda5d5807eeac6d8f464a90d8d2cdc01e71f735e7b782
633f771d544541bd9775e9c7eeba9775cf66f7b417986321313121d2f8b6edd2
a1f92e98f92e2d46e44e2b138df641f9a7767abdb2d4d94a812bfb5538d301f3
46e401bc04db14474c2983c4d0591888eb5021313321624f21333321a207b14c
52aa655de21b21392147c6d254384064295f5b8e1d3b3221313221d84472ae6b
4b8c70d31b922131363021a7a221313121eb8263f0d465acffeb06e76bdb95e7
662b7a323938ee816021333321a62131363021503e1eec8087df5a2133332156
f29dc3a8f22130216ca23951db617b724a54b52671803b9b697c4c6fd79eed40
692db960588a640856d2b276e3019b4bc6f7b121333321cc7e81554d1757186b
a18f4f37dbd92133392113c0b1264ff54a0f6f16328fc621333321a35e9df2e3
e54003e9896586b4b018a49a978f71b84afcdc93c1db2aaae3afd82131312111
9d512de1332464b03504f8aeabbab8a38d316aee3b905c9180a19a26fc2b7895
b15f24230568d2511d65a18133e66f8db0ecc7e479f5d9a9c19c2bb212712c38
419e5e762e49e114297d0768545a646d1ff9a8775af2839c65e4ea6d21333921
957ade0e3ffe73eac2b7e9ba8344c044d77a33e8aff7a6898cbdf72bb36f38f8
80c3cde231fa1c17ac82485a49992659c8c42dca8dd42b5a78ac21302198f858
42ba83306a88e45eac1e0ec3c82ac695b2ffb48d2302c8c0bdd6f8c14ffefe5f
e1e24c3b0e8a452131363021202cf9bebcec9cd7e02133332194213021d58ba6
bee0b4c2c60e830221392184b3a2a3169757db8230fa84ae7812d45e13102131
363021936f2130214c136e87dcf7ae14e107aee630a908f21a39fee9ba351c3c
ef9e14d1507f7bcf24776e5d8c066ae74c45e0f597213921b17eb5213339218f
508932f61ef8bac0be4605365d7f7c36995e7e437dd77d49242b3f29ea213334
2113bd6730708d76f7d9c4a821313630217f16cb6dd5931563e4b45c1dded3f4
684cd36677889b9a38692131363021c5f385dbb14564c6d89eb3456afe015165
417dc868dcc85d62b6551169df0e34dd5eda38deb1457003663c79ac0464fe1a
3bc6aa47acae3cfcc021313021cacb8c847a08147d57e4d774bdb6918af3cb18
0efa5536bbeeafa8d592c193aa57f6b586cb5e30435548dc5f05e8964cde36e4
6dfa1aebaf21313630210277b35669dbdec6e1fdedf3512133332117c8213133
213cf945e1dddceab2f7dab7b38c8fc713cb5563cd21333421b21550f0e7a718
a464a3505141339f7cf745566dfaa69a681788b3df527090aad4daca36209806
5630c121313321eb910fc1c8be035de0fe047515d538e958cb7fcafea2ee19ba
243619c744f2d29cb3213136302167f0d1b7213921c06fa18923e66f21313221
cf4b54ccc177ab2aef8cd8758ccb5912ac4e6adac046fc8b4c21333921651997
ef84a77b9102c5f6f5cd28058642376e4e3dd324da92ab35a62ae634f4ff9475
21313321c312dfc0cbc57c81332e44d92c4aab4c4b35fa36e4b5213133217e19
b43c43b1f8213334212131363021992133392134c1132e8ac92d049e91931ffc
ae9b1621313121385c6e24cc6bf905032f8685062139217921313121defe6e24
3f4e2ac35dd21ced3e9b58bf2131363021866821392181f42c2131363021cc96
3865b5ba8e7391b61e01213132212c2626f2e886a6b1f34cb5fb450ef516df59
ba063f2d4c78258e47e6166a892f69391c213339217b3c3bba440110a9f6fd21
333321e81d213339213bf13335fa2af9be384af09bc119db66877e18e34c970e
5f82d079022e7655707721313221e91884e77e3042fd75fd6d5d04b85a296d3d
8d054916eee32f8b6523540fc6332130214c4de56428d8b1ff073e7a9dd3874a
013df39c9d1728028ba9d621333321fa6ec0db98b31f5b31020f8cfce973eeb9
21313221265d3a317c3ea7be2f7b5c213921b50221313121fc201d4acac4c2bf
3021333921bb342ada4bfb6105356716a32131363021ed055f483dd7a8db5ed6
1c248221302150c7e4d9471ea8ba7bb91901789cdf806a7190736f8d7c593dbb
d24f6c244c39e7aad98f4a2130217d587361985ab82ee345e4bb5d9c2c76b45e
82796803af21333321eaefc0413796b0bf7c4be4b2889391e37b122131363021
9b204695e7a45759f7780316fb544d2139214e67a6ff21333421a7bae7d38bf4
2edc239cebb8fe768edb74e94bbd84e8e310a7213334219bc282a9c189b57752
d89531f9205d88893b323f7c2e21313221213133210f3295239a4a3a4304aa5d
a507c015a7c585bac96a2d79ae6121313021ca403f605ef05bc63cdb5e4ead3c
41c939d6c666d403f34fc61aa12131322106e44103f8bb8d7f62cfb7ce3f9651
f1b653f0a84ebafe3a3c32894f02213131218cc9a5e821333321768a736c12c6
73afa161b5829a9a97e821313221ade75288e6a56bd8074012889ba7f5f6bc90
fbecf0eea162655df81c135c213132214cf185b8310821313221c0a76e135985
ebaff398dbe065d2c8a8da2133342135592aea7be1b0c36176f8cbd81546a53a
71ee5c49feace226c040f8db31f7a468d7c432cca62d464b13866296567a9cfb
c1345d84e73e213136302154b8d12d92c63f3481ad7277189959bd75f3e95930
c65a4b21313121f45849c9d74325b485841921313121ffd1a74b7fab7545d307
213130215f642c756fc40846f3bb23557d60e4a7bde82fae830e45bb5292875b
18f0fee0a3e1bbb1798f529b339eb811d8ab21333921da21333921213333215a
166849ca2ecc8566d034b87811d9b53195c7d9f5c85b2958eaacbe6ae829945a
a7e5e01d4316d4434562ac79101e03287de09191fbdb8f42b1556f9816457c7a
be394d21313021986621392144ff8d1dafd3afafedb482c4f5d0598598fc2a50
5fed2131312155e5213021695b5c7a2649d6c875e45a3dc5beb29a16187e90b8
a8b2e8daec02b02d319ade0ed073f06ad6c28eb949010417786cb94702e72897
164557d2ce21313221f78ad253e6d030a451b7d7eb1b2130216f2c0e4331af9c
9a5745e2f2a98f1483eee1ff50f0ea39f4ac7234f69ad5a533480f6de338edfa
7468ca87213921f66b4ab28c35646159df8df6ca92be7a82a19501e2ac72dc76
2febee5608a3025263d8fb269ec7336ef3457493506cef0737e6f2df2b1d10fb
1af2f78f03466a14d599948f8729ef026f29502133392190b35e213132214d7b
a551a6b59efe2131363021e7c7f7321fda88bf1b21333921865ff53c5a8c8cea
077ad03236ad770159a41aac1e65376229e8b33af4adcf6a74c2e6df21333421
8d1a6311ed7b21313021213334219089d277b54d721767dc8c9f66d11b2b8a21
313321075980e4fce4b44b1f2131312148cedd708f3495b166b93952cd3a5efe
17c4a12f24fd8268a4c01d5196eafe7789685bc6cca1c2f967562097bf9d77a8
01b47979518f9579d21dcdac33a674b861fd5f1d95591fc76db2cdf7ab7b2131
3121a94cef599067e57325a84c34d7c4593511dfd8b9b1efd9498bb07ead701e
b2f3831d1d66265c408f9e90786516ad21313121a3edce7ecee99df8213021d0
5d854503d6c53838986c213334212ea34a2131312196b1e98f7454d924181bee
fa213130219e50ca2d354b448db8e0492cd4e3c7a73ca4ad02b8196a11a67723
4c550f4edb53eb4d19e682076ce1b5633e80213339219d6bf89995c8ab8e4133
5ea8c5d2d94def72f70539d163392e918c93d06d3a20f8ef2139215f6c262133
392174243932608cdda4d2ad8f50cf125f1042f93fcc9ff9ad11b616ff242ec9
4f95fe1ec7c93e899c83b187f2da8b8ece9d5f89cdc19ea2968a89ce23aad06a
d7e7b688478a0f104003893e21313121e3b6610443972921333921693fc5628b
ebe555a7fc761296730ee42c213133219a772139216ac9c32131302121313021
c4e22d77e660de4fc41c206b17662501b1ae2007eeffae16efb16cfa258a9a20
622d4f61838a1641f3cf38ba59a1801dedb9efc3d0ec0ffb2d50bdd71657043a
7f3462706f34fe8c45f6259693936839d4e948898263691a9ae07a4ba1888c9f
b1de4c80d26b646bf0984d638c114b5ac22f282e8e21313221c205589383ef61
5d92129ebdfd96e6b167433846947258e84dfabf9541a1c7bc9665c67325b37c
432139218fe9576540fe394df929f465553d5d21313121409829c965eb61dccd
dcd9c54b9cb38dbe44154a7474fd867c59f636766c45f98d419562c2ff46e121
3130219abb213021784835d78ef4f5876f5b213130213152207c127deb013f98
213339214f62472131312195e0e3213131210fd3ab1e67ac653ca4caca1d174e
bd131e1f913020ba4c5d16dc62f8876bdc19c5e6cf05c1ff5d2131312168d154
3299508e8b7c4b80b703be7136a4c4535645ee61213133217ab4526929213334
2187b80e5a80917f94ed82213133219514fb7d9014e12fc841a95c88bdd48dfd
4505c0cd67d12aa6c4bc45a5dd6f78e13ea5d17162918b9701cb7078bfd82cf2
75213339215c4dfa21333421c38ab26d8d475acd7ec05d983b26994e4ad64a16
fcf43d446521333321e095452682315477e499c0ed36ce993eeb7fb1eb23b164
c7df04fef57eae1fa685299845310fbe1831199a2bb5fec36645985b4e382133
332123826e80ebb7dd9f2131363021567b465e6bdecefe016947e750bb64126b
3bc6e77569335a2dd9fb751162be642139214eb72d62872dafdd2eb0df2fee30
643fc3264da18d26114774eed4844a717573a94e31e8891af2972b592b329d60
673e599028036adb9177511de4b090e53ab6b1e329ec726d07e1e53dbfa71278
65af9d352f7afbb167056b213921019e52e94713b94ac68d21313321aea803f3
753c21313121ed23fab08608a8e37e25f88b3e7f4e2139217e1869e41f44439d
6ebd8e4ee9011fc49c17f1e37708f4fbc7017d0f2a2b2131302175135c423dfa
598fe1d3be7c36efaf8e1e99f4c880eaaaedd6cfaee4f8467d694abd23e387d8
9d82cd03202c2cf96eb0cbb9213133215619bb05f75b52213131219741d9b367
0effc75e775b2d05d1864421313021752131332146283a76c33e1f94827fc8bd
543b209990c7024e29e0fe2413d47ecee39fdee243fe2f9ab496a68133f47b
Encrypted(F8DE50750E50605E3E39B0A628A57FCE25E4BF68)
25f5ede818088f88dc93f5236d1b8921313630215f182b923eed213021ddb45e31
c78bd4e06b18af65931e360e6794371a6ae6d738e38925dfd0e02130216e9d62
9aa12318266430ad3aa6d224a235b4842397b189213921de213130217be58992
24c9f25e65702ec6187db81afc34780115bb37d0e170493630235c85dc03aa6f
3238af46c988cfd41e213136302101c814637ffcbb96419080d4d4b9f5448112
76a28f506fb51f306d36b1361e64629c2e248332a6aa637ff4b59759eadfc385
3b6ab9233ad95d3121313630217035b0661c2133342133e479c3e30252868921
3130213c291cdf0708c9ca21313221b3c21d1e56fb572e6f36fc65348e3f84d6
34dd76de9764ba2d499d4afcda16f69e54a8c0153ad080dd304377af3e213133
2183a221333321cd46155a332131363021258e95b65e5b9dc6f60f21313221c9
45bc4dd4d93e67ec08e08420f9375783af89b1f6a4156a9158143de0ad1524ff
ec26172021313021f405ff7b39c24ecd14c9531b72c1e1cf62f749b3e8f345c4
1fd1fc6e10ceba4ed1a2839e9593eff911d8782be8baccbcf9213921e4a5c87a
24fa21313021f5db3f21313221d5f5a57ce34f33d3f0b92139216d9215d6c494
751e8a6e301221333321cff0c83246f6114ca4745454295e2e01c97ee9769191
cab2f218658a578881ca544cb784d695aafe938cf67dd2d89063956f352b3743
f4282131363021976348cebe5e7cef4154aef33666c16279460f64d8c16e3b7a
2ecada10da1ec62133392182b1d91c324a5bacbd3dac55be5b2341fea12c7873
606a4195afe2b798c4c92131322188ab1f9514788ee1da7b516e6753d370aa36
2f9474d379a6f6462f458488bd2a2350ff167b65b7e5d9d5e9265f266b7a8ef7
7ccc7177857a2c21313221603c64d926e69155dc12109e90d2850496f0f9e045
ed787a14a9248bc16382fd59be9d5c4cf31e456a8d170640c2398885a183b893
b6213131217cf5a352ba2cb5fee9a4d68ced034fb52133392147955c9e89fde9
57dd1d89213021d1d97a3a21313321c2a7741fe4c07d4c8dda597db931e5e6ce
372d4672538c061eadb740be58987b862f833ba20e6a495913328d7450d5a24e
2955354b35a82372bfc421333921e538795a9568953b6d6f598978e61ba520e2
1ce5a138541e7b011fa1d5de2954bbad1671bfdcd8b7d7faf8ea9dbfa9cbe28a
fc5adceb2130213c829ff830aa9153e3e5e6a52662fa9b80f1dbb6a4c7bde421
3339212e8f5244d108ae21313321cb9d307732d23e67601ce72131363021b273
9c3712213133214079e495af213021fa70cc5fa1ae2d1f21313321ca7f924221
302114c2b49751eca9ea408ebc0e2e5469bbaabcfa57a26f4dee7bf5b6fbe59d
042fa145373b57b4b985ca904f814e50bff8cfea213021d0e31eb5c48b3e90c4
d121313121c9e1ec31d46fd77c98a3d5d5c0e45a1f1b079ae06b8a7638f4eb71
1bded55747b2d0c45c7eb9e604e9b2200685b65f8ad5e5cc3e5f8699c3393deb
d623872131322154d81de4b52ba1b744213131213acbf4a8648f019d65213333
21aaced03f5b15a3bb015bcc9decb99a314957f65dd5077a903a5cffb05966df
b8213339212130217277213133213bc0cd98c5b92eb558d5dceea59470a5d598
68e88271ceb15a0641a2a3da9ac63393bd9d4cd9b11f9d1493e734c66dbb3d6a
e56e743299ff6b987d6b617e92692f17802130213e8d7f3e8cb1787c520ed7d7
595387f5a4761c1dfb1815f5effd24032332d44d213921d640c4a6c2164d425f
5b13e0cf8e21333421b8d9bd1ba6da70de607377178c07a36924e54a1526363d
1cbdd220c38d132e4e2131322181628d946b5737213334213096521feae87ad1
d42bcfc9add72130216f7b388a80e09b5fb49c4830af25c85eef9074ee213333
21f6e361bb3c957c5add6b01ac179b16f504213339210484441119d87942da48
ac1f645b421421313121e17255ef04f07365e3b821333321567480b456c5f3d7
36bc1fff6a1ea1c886ad152d52012d5790ecf215dcd4c6749d6e0624d991fe44
23759254fa7f073c7cc39b5fd5fc17fa96ca826f653012d02133392121333321
0f5a30cf471f24839771e6c3e0b79e78b24cceba726c1c29c3b7b8f8af510e65
7db29eda1becec7d4c4a49b3d21f19cdde792aa13d21333321213131212e33f3
52793659eae4aa2130215e78681b9d2cd2c703d0a24a1af0c3d251666b252b59
753bb74655face1732bfe96b70ae4bfc7a957f824a64292cb2f2e0d07a89e049
8e9f92a9c629f8f621313321ad3159c817e303e8f4f3d426c41f4f29f2b11308
3d7b1437f3bedb05068c81e5b9c215e1eafa2fb44f88d1c3539fc17460a13e6e
1f798cca6948d5dbe2b948c2f2de08f9075fc35cd4f10121313021db6f745326
2130217976262a4481c0c156d3db642131332108213021c9a13a0f890643e42b
9072835295a8b021313021714a6f700e5a411b535099e07e01ce3be8ae5f1659
b48eb9d4d0f853512ea14aa21e5c28ffa4dce38dd8cd9a779d24213132219b95
f9ed4c5d20eb300736af66647ef798ebf6b0ece46a6a213131218d34b4383914
8d154f3e2441d5b0dfc5de13f532fc7df811f636a89dc6b84721333921ef626a
3b4fdb624fed5fcf16e6de7da19394d2ba9b60d731bae26552e7e17704a2daf8
fa6846f2f4425e2c5533c32fc92432be501a5689f64aea30b320e4fcc7302133
3921eb2c7c2130210f9a165a12c1a8205b875cdb3913e531b779c65814fc89f3
786857e843d69c240f2aa6f8438b0790315576e9cbef452ec9a4e8213339216c
30e61f1356b96896d23b481f5052e50502213132218d08df6cb8e6de43e49bb0
17c20205e289d75a5c72c474c4b7dd33388b80e14a5b572321313630219290ed
441d9eeb447001cbaf356d29f606cc4b23e20ea7a3a2c8a5621328a303901e80
7494cd4a82b5f3d7213333217787243b368d425ad4362d72b798dacdd365869b
f7ed4c87f916f2fb4b213132212131322169a6
Encrypted(E0CB2A0E57D842AB9D4C90C08983924FA852788C)
fa9fd750d7630512cad185be5e37fd7aeae956fa44143f34ed2eff7cc921313221
f7a470b0f8213921bacba52e659816699588ab93213921f98949adcd4decbcc0
3fb12f38abb4bcf27e97618120bc2096765def773939601f03a20886d9eef4ed
cefffd7b4b37ae0556af87d83589e975b1f13339807821333321ef2133392188
268af7f985ae4e70b580fd6666c73d796711255bae3e05deef1bb73d779ef742
b3203d8cd76f1d7aa6393aa73cacc3dd553e5eb064dc916dda51a6ddec9dc073
1a559e965538906404ba0311f08f5782a8282131363021542a31d44dd602779f
1e823edd17b1f368e578408f8d213132216856f21099db7f0e21313221d38743
df5bdac8e48b5d5596be183b1918c921313221213921117d08083ba959069ba7
93c41559e94767342a2f7787ec7332637f21313121baf587142130212db72d67
2579a8c4f8e87bcd554865825337c7e0395fbc7ed5f825dafb782139216138a5
3c7bab17ef12c603985419d96dab55247fa72f6d12bb0317e23aae9ed42d
Encrypted(3E289D3F11379CDFDCBDCF1E74BA67D9F5E35713)
021ad752167b04186996cd16f1927b793f7ce6e5cfdb18d2165597bd8121313021
cc4145213132212fc6c31953b42131363021a7b1ddf1071ac94172f228213021
88b6ce91a382b4cf68a27e664e666928b2fc9958a2213130214679ed1db642b0
04b22ea7fd977790cbeab06b192133342147ddc1c02131363021be2133332160
1a40f5d682f0c96b428f20bd553fc95c1db07154a3d9f5e1bacd283f67f72e68
213334218c213136302114213021ce6db97968196bd6f5494d08944d7fdb5cf3
7cd26d0fd8fcb8ea4eedbcfcb8eabacc21333921d805c37062b1e78807c47029
afe978026198615aa933c6b65c3e24fb6706c5414c1710a14a8ad7fa16c50ecc
b7d5de2010058d213021b921333321364b39d16b1507c5c73bc3f75b30cc03f5
02b0ce2d917a2e29e992771b6d213136302189712c768ec58c6d529e75855433
9d3dfb68eadba84c82bd98daeb6324580579f0656a12671d931b57f01d4669f7
2cfcf130653e3eeeb3efb52bbbd50e98f254926cff709d01129110f5ed904b16
8fbe77fed6fe1936b9e77598f7a23d6451f5df4915ecfa21313321df23da26e2
1f4d52923c05e30466573f504d3ecda71faeb4bf264a213333213121333921a7
c315abb83f60a79a19044c75c3e9023c254cae365d236eaae92133332161484b
dff0fec5445c4121333321741ce8ea4343bd987a1d7490e9cbf0792131363021
83bbe66e72446977c378213334219328508b488c894854a13392872133342160
4b08e5ab41213130217dd0434e2133342197bf72c580f2dd953376662c73e0d6
a2ddeadd42853c2139218724e81689f8bfb9dd7bdb78654f34af9a6d8ab77e31
a3a14c5cb58b787c21302171db21333921ee2638bd4f8153abd12da5d43ff329
2e789406665d48c42131312137bb69ff2130216f2ed0cc4928e0909c2317e721
3132213aee1e787074a654444b831707cf68afd521313221d1d6c5b8c1c8d3ef
a821333321cee433762f21333421681a761218ad606921302120f83d61d52d73
c97ace3b2b193782c3f02033712a6184e286213021207b889b9aaf8edd8c1665
779a3ab6a697c857dc89e6e042e6b6f7f73f1a9b9e7ee51e06885703dc989ad6
b3f65da1f8b4ab5ee1988ceb5db089e6e3d144aa0316b674615fd89af23a8bd0
8be515bbc8795107d2bcf5213021dde7b05037335852209c4cc1694a56402131
3630212666f68b84181b2eea5621313021d5adc0a31b3fd0403b7542a2077221
31322163c0b6844c7a53fe20e4bc69905fa721313321cba279b384b3fb8b35a6
b5ebeac66b797d6b5c44d058f42e2c04b7e2c598f2e0d150d01c8f943558c408
393d56368936cae42af5f231d8392c6c72153abb5f88d8a157de5648d4420421
313321c6e34788aacf50429f0ea33c8864131950436e2fe117890f67d0517a3f
236bb2c0aacb93a775d3a2c8941fe4e9a5bf5012eeba213132214494e55c3c6f
9720f484334efaff652d2901cbde3aafad053ab86b34213132214ec352016f85
0320dfdf62ea85dcfa393a2e2a544a72639aa298832131363021a42020ce12a7
baa925ad45efa83cdff2936d213021aaef13371d8debc7e7e4fdb91584dbcc97
d221313121aff2b8e112e56cba9961ff99ac81be96b865feb3ae77c942621e15
af2a90629d3aaaa68aad65075fe5061c864411c4c22139213253ca113c788769
1953d66d19a4074382b3b5cba5c0c64f15d26352d5b7ca50f6dd15e8e3b6f135
685e638a213339217e4de7d7941c6c1f1534f148e07b04452619711f2fd22133
3321f1505644a4c1f3601084efec520474c66b867ebf213921fd7226cd96c089
e4742c132bf4b6b651dc37684a75e7e1653411e0bd08237384089a4151068556
a58f40fd7221313221ea182131302148b468d3cbab21313021a6be1871bcab12
e4e6547f915a0f625a8167eeca7678b1e866edd5c68db14746e616ed16147594
a1a18aee5cf56430ab909206eb9aa54b66dbd321333921dbb4f4ebee49688272
98213921c788702bcb8eed9b1ac521313121322e94a43d4a1001d06a89388539
ad5899df315ea323bb1b41a6ac8e399617c3cf1c7de0f4d4a5f016ac6365c479
7326d3ed21313321d52133392170b47796409606fc52b6c2ab6ea6bbfad08332
b21d21313021053eeae8838e07213131210ee199d7fa5e5b810f213132212131
332104eac09c2fb3aa8c21333921914283b22133342121313221c28967980121
33392105bd448d26a8679ab4deb51098fa61ab1b213130217f62824b017df372
21333321dbc1294e4bbb59b721333321a83d89a6da2a4079fbe1433e21333921
ae5e7959cd1b71d0213021f8c6c802cdc3af82db53d08b1c60c83dfc69839f76
95cbcc6938d19cfb213021b491fd21333321731c9a9e2a2ab144da32f9fd6129
e9fbb921313021cc9580906b7e21313221df012a654d9f29281ef6cfddbe9b21
313630211287bc213334216c69e550ed9b03e841ebe0a14dbe7a179d02046c5a
6026f17c53d107cd21333321f8d88b69213131216e0e042131363021d6306dd6
c763b6d0cdfe55e72cffe570d870a47c242af2df886861f13f13617354eee78b
9d55347ebf05ba906b35116dab0e8332cc7d5c2a392fd052792131332161d48f
617899f4d72ad3b0a30721313121c574346ff2cc4b46180fe641213921c71f28
992a2ae9ed5a3d8515860ff58621313630214d0ec3a368a7c9dc506396bca56b
63213921d5e1a186213130217cd04ede6a19a758fc072131322124b83c2e75e6
789d2512885921333421b3ce719377655cee48cf9fe5ee66ab9038ca97f8c02d
5aba66f2a5c85f9584ffc661dcd020c83eb87fe278fac8029521333321448be4
fbeb0275f254015be6dc2c043691e0a94a9a3b1346e6c1a683cfd7ae0fa72133
3921485fe15c89fff101c4ecccbf1f47d3cf3e28528de5d1f6fb06ce46ef7216
e7fb7e4dcc638e7d3f9cbb9f012fcf6956689b16291de50692ac6c451b3566b9
2fda67340ef4d76f4067441a38a91fd31cd4c4493e9780cba2462074d9888121
333321dfc94aa1148c373db6f03ac5834fd02f6b06f7ecd4b3322cc62bb3a65e
a31805f14c52b8e91c5e7d4ef17de38e9ae1167d81e8436de50f6ab221313630
21d38899a6b170eee96ed8d26bc5391612021b44af9817c23bda5f03dd86b526
05d65c86af53fad55585a8d8929a883c7774d6ad20794e7cd92b3aa984213133
2106c9f95030b781770ef125841e9f9aa5936c1bbc03a64eaec4ccde7c646421
313321df41510813b471a5ea5b193f5e77eb21313021f3ca767a9cb4a1888821
313221d5dc176aa80e79fe213131215ea38f213921fcf84a61e4b299a97464e1
04f9336c90a931df013ddb42b0a952ea284ad0508962d224a4f9ada8d09799ca
213333213a4d88615585b9df6539103d35065d10e7baac88fa21333921d62dd0
657cb8062456355ff83677e9459c7e456a99f9996bde05f9748ad8cc2f190f98
87957c9aa37161ff3476e00817daf0ae8d70145f135c5baa5e427437e51ec821
333321c8d6e93d213921509175f71a21333921265b42f2db25213334218feda9
17b2c779213333212c3f2133392145aad77678213334213523b48acc4f4a8af3
dba32883775c8049567062f399372bbc3bb472
Encrypted(89772A202342C07D37E85A8B7C9445CF147E00D8)
0fd921392181213921d64b15313953698b21313221018affb02133392121333421
dcab787eab9753ba21313121a3d79d21313121bd6dc8942cfaea3f46b0ab2133
34217d9861acd5c497c6bad07d18e6662133392114db9d38309c11b3f0cf8d15
b82e9d946db7b2303c301d3d0f25314bebb15f757f2f7a74adab8e0613dde9cd
5671a2bfeda7674108faef2f617d9605689ecbd2d1213333217da58bdf916324
1661236fa437bdb69d662b74f17dfa323af4812131312120c2544f6eb9d4d321
3131216bda8e3249fe5bcc14de23d5d30e9eaf129da98dd70e43be61cceed128
1198213921f34ed9c154b979b18148a101b7488093d8abb25cd0d461aaff5a04
dec4662481d124dc835ad6c881e2d0f9e3dc765f8bf874958856cd5e21333921
f6f384739558d589e887c92f213130215377d2381d28d7f403c157c385c7bc2a
9bc1619102e278d3882130216fa9ceeeb3230792e5bf6ede7e9c2139211a5fbb
a757ce4124346960d8b72efd102b7508c97e37ff44b5213132216574022dd3d2
213131213d828421313121754e8c8367be643a67caa244a79f64a483ada62414
e3d103656bc25c1c7c34bae7f625bd5e473f6938c1ad6ac2ea0641e566010856
db7e9644f22f2a0429fd6fb324e7e96a53a3d814718bd3e76bd7e28b21333321
96d63fc6e0033255f595179921333421f519467638a38f49022d6e6df258af5b
c7457064758bb841591a132bd4d0ca75285659b0dded21313321c9108c66d370
cb6638d63242c4bd7655f268c9aae067d9fd91e1d01f3aa1304c9017e99fa6ad
665abf6701571f21313221592bdaf0c890a369e3956ef2e89e90d821302126db
f177abb25f458fc43519641a40105cd214af8ffdb2aa316ec18f179726f93265
21333321e76f4f4799029068ccc27ed712a247f93a3fe57cc2e9892b74a1019d
7557ea08a35035e5eab766e0edb356a77d9417b26e35c5baee815520519b864f
ba3bd24957b53776306f4432750335985d21313121e714782c6ea3bc5e731d47
d62fab6d482d8bac6fb95f9a9e8f43efc03cbd5eeed564d9e9402453a217f9dc
6c48f72b0e29c48d2f1c2f145ebbb13c2d125021313630215ef5b9a9949cb2af
3daf35a1c010f121313221e677b89d408c15751bd7ecaf832a8050afd8fce77f
18885cf8213021f26a911fd80ee30f7ea12fd344eae7213334217618b8104eae
78f37f8f3965c46347d62029e96065d5188f3e2c53c4ce3942b999be2474a50e
c82fbdcc6604181396bc43c3de2133342119358a284a19c380c02e12751293f5
797b55b2d33861ffdad1b8663a1b92682edfb004017faddb1dddea7dd5dfdcaf
e59e1552d9f87b861cbe24c634fb4f54fd72d3e256bf213334212130213b02de
3bf853ae68a528c3bf42069bea5d9adfda4faedf95f770ecebcbdf1016213136
302158cee1144886c12495bfd45608e7de7b3221333321d6fe5734ee0113e663
f23062e4bceca8a828f5a3a8a2748aec1e69df46339634fee333d45d21333421
b37f593b6b8bc7d944046bcdd72fa78935de23789972d61bbaf12bb0724d563f
6f2849308ff83d37ef68e01278c53a213021c89071f24321333321116ad0478c
2c06b0c4c2f2fd3797aac9ef472131363021f2116ef345fc73d274101c213131
21adbf38dc4135c956b644efce9b3783ab2808baa1eba421392116695030a5d4
015b892131302152213921e1c028f2e7b9f07bc84690f3cacd112e11b7eb453c
e4254d329fcedb53418ee87164842521302121313121e2d0bc6bde518a1c3369
49cc23213136302107137e9624bccaacf09a034a4269bf9b6972ce64fec649a1
d87fc3213333219920f47bc3581fdcf1c721302131019e8f564103b8c5e12928
aba9b31bebaaca7ee3ba1e05bec6cbf52bc9502f53985b48437d7d16ff8a5321
33392182595e621cdd05c5d4fe777759973a745b213130214e0eb48cb1d4a2d5
2624986e5fba5ba5baee21313221894c69682133332138b339ba15f383e7c8fe
f82e23c0f7ee7d21333921dab441bb40365e923228c88e691e8de5678e10052d
35538f652a41555a7a88eff7112131312192fabe9aa9e280a82131322131855d
95d415dbcf6c4997df91ff377f99cc84930466bd21313630213469aa4f78d3cd
1c7b24abe60f213130214b97f73fbd7abb28383b6b60df589a06ad4e13b85745
cb3b34d45557acb0c51350cc8172203dd021302119ab259b0ff8142131363021
202471baee8248fe979c1afb2c2e413e32b75bbe2b322821333921994af51601
9940b57273e4e893896b1b2987f6f848b933c2d4058acc95f7e18cde95558eef
7c7ac82139217bb9d4156490ecd2c575579433fe496c55b7d748b6ade84cecbb
21333921dc1ea2503f57f1c7f95cacf054ffdad2e0bcb6fcf86507213334214b
65eb2318d5502d242933b996a1b796c6a1cad895b280ff28de94605457ed6970
997f55446ee8a9048723af44abe3a9363041a2d82e209f65795fda24ae8bc88e
b0cb6dc05b7de7e9365c7849067c11bce904ee9080eab9b516bc4a77ec41a6ec
0f4d532a2ab1c31e2416fbdf0615696d7b603b8ce6aef94d15f2188032b74f2c
189366fe32aac95b62126e82d91eeb18745258fb406ff7df60ed8da6045e2133
33215b8f33131ebcf7423e91e18e85cb42ba8b8bcf6fce6d5aef8128a5ac932b
657fbb97724c7114ef46e29366f29799ab39e3ab21313321792e8491b3653ce1
13a4aed621313121bbff6cb114d6ba1f479548af24e8a73c3c2cc66121313221
64535a56f7eebd4a9ca48f2eaee8c77945e242b88a01fa7a2133392129fa3360
8480555dd08c95d24fcd06b41d971b3041998d429504f51d0f21313121563442
3745e3a9e2eee202bb3e61fa6976eb7e7d11befc8e6faf262f9ad164af90aaee
de1a213021cefcdf054b112c3d2133342199bb21313021ed893e251214e6ff53
1edc293da2bb97dd3772aed64cfd3f24a5b55767ba713aed8f9dcb1a9e824bbf
2bb217abd3950503159e28ad213021335ec095267739d46d18dfddf12e5e1f7a
737bdc23bd6e9c9e65cb3089c9f6c031436d1f55dfc4213130216e8551213131
21da88d76596d5d9841e018eb4adc62139215a0621313630217824e66b886b3f
68c8d3da5e88f93b49bffe7b2f4f12c74157089476e9494e45083e2139215e68
408b73dae2857ea7577d20cf4121313321c5e182073c454998213130214b52b8
022131332188625bbdb63c825c987b2947e56545a63af0628604213131212f5f
0499762133332160d7c59b719fae86fb21333321b8fca3aa4b232ca257d1c06b
9dd06e76ecb06a4755957d3b8d2131332180a97ae4aeeaf805726267efb02f05
932cf02131322108a8d3ef07c35010c17ff1fd4af62f7ccd0f0e4c9c93242133
332121313630214833c9b9ab33ca3a9bd2762f2130219a4ce4e4576b84a67940
4634d160e55dfc851128865e90b12130212da75cc1cae147b96565acf5ab7858
597bad3c43cb143c106b0e2521313221a925444e3805c42831213021cb16c1ff
c3402d2fd9d663e3603fcb1540531df157de24213131219d6d0876f7364c9e37
dce9213130214178d8deef2f4acbf36598e6dd946bdb21313121e42f8c7f68e8
83cde77dd9c6a98497ed7169992c6d829fb9069eb5a15cda5ad9bb764a20986e
b0dde5a49dd91dacc32a91b9343cc8072130212f95dc77147dec62f5f4ce3a62
1225ca825d77dfe180156a11bc6821333921ed413de0485ec116213133216752
1e1ae85ac9dcdb9ad93b072dd9401a5464e3fe06cd1513233897500f44157b23
b5b81821333421ccad5e04bfdcb96e6d25716e8bec4c77111b41dd2ef89bdf4f
2464aef0bca9c3c3f59580a95f8c1c5e58122a11d8896a257f624610585d3bd4
0e497bedd776a718cec8fef6d15a5ad241f9d908c9d19a4c5bf3536746a971f3
66b29508709094b366851e328be1e360d3c0e31745bd15d64ad13c02d239988a
36cbb595a1c4d267c94f4d893a842cbdb3de1d31543621313121969cee213333
2155162ffea468d0393a79213133216bcb26ed9b351fe0b95f29ca4d060e9361
3790321ae77ba83b5cef213333211b45d7fa8b4d37188970b969046150b640c5
7f3e344a2342d36a06cbbde2dff2c069cfa15c1521313021ae84c721333321fb
029a918f4fc0d6bd42d7d9905afb4d2c5121313321dac349a823e5a1eb3fa862
809ecc8eb0e68d37947c68f7ad48c4bc3929821289d7dbb6ab58713f95fe4371
8e35f1a821313221cc323a7d25e94a7fb9848616fd7ab9f4fee45fff06d245da
eb2ee278e7786aa55cecbd7312c4b44221313630218686ec21333321fd5bba21
302121392135a524ef4521392171a21901854ea148741421392133dd75b744fb
8702075fe5c4651ced9e2bb22d8f119a802a9976113a36ac88b0ec6293eb807d
4db9685307f57db4c5ae98cbfc17bd2bad7f3fccbbd2b04579ef42f52bc2fbf0
a820f7826079efe42eb9cdd485da059073f27297709c7602e56380f5c13d55f6
ed2f59d5810f92633efa6c52213334214925abbe8917e92089f4213334217e3a
ec0513cfd1f9a29c5e3ac3de831ae211213021f18faccea3db58292c596e67f9
25acfcdb166c34ed1c76943dcdc558a540ff1c122131322117d45143ec0364a8
3176128b58ff148fa3ee90cbdead85cb05472061df3bba4c384a9fffff50ba77
a318633b9c7059e7817e94f032382131363021f51e73b4ed2ccc6b948e28144b
38625b1189ae3572721424c085652516c4a232fbfa9017f63b4507a860198287
41b105b735c3dbbc0fab4e978020d7213133211863e3c26eadaf3b8a4b47f4b2
8992c89e62e364996876a3e434dd4030b2747a025a2064e49f309f2131363021
10d1f13a50da7357a153e121313221e4fceb4a0863cc5676a1451841b9b292ef
91ab26f8c52131302198a44694a36a44cd531d5018345c5f3ee795cccc2ce858
4396213130212133392116d756ac62c3598d6e71ec37562131363021c4ae9c81
2481537b2e3b2131312136f34fd02133332185f89b556421392107836f2e963f
baad45bea21653b36c2fa2406db13789da71a4fc872133342171b09324b33412
43c22b3185de7dd4a834ff33342131363021e77757e4b3cbb048014cd288195c
759eb1929e57398acdb33b9b8ad9144777decc082f3791baa938a93ef2281107
ae471f07923d213333216794f64bc5c9e47c7c21392191cc823cc637d666d9a9
7431cf11a9e82bcf654454f32ba3fac262a1dfeb8d335a08a73fb72131363021
c2f8f58e6c06213921370e5d2c9a94ad3ca16af34c536cc74378a6563a01e563
d4e0a1c7ffe24321333421dfb485e38b68413cc093cc2139213b910566d674fb
9f357c39dc15aed60608880666a71b3d21333321a5789d684c52d8ec9ae1e363
b01be3f645dd6c6821333321de63ff4bc9b96621333921e3ccbf312546746120
b44f8d5ac21a213131211139b3705bb54d74db67f847183aca50c331ea08fb78
bbdd07bf8bd85b3d637ce8a661b152df20d5e745312f9639041f50b99e90e486
b3d591661ad44753532131332189f4b825309de6bb7d4a213132215372152021
313021444228b4579134296a493fa279213339217575c8ecd06ecdfbf89b1644
08f8b2668f213021fceabbf348081e702c10ce2c2341751af776bac458ccf3c4
b9e13bb5ffb8dc213131218f965c1298af213130214d9631ab49980704c46980
eb911b84c89c91c3a341a559ad10d49662caeba5f3590fce2d349b6d988a66bc
42ea98fe44caa6fbabb4a292978a8e0e509829a31357cbac7cf6c4834b196e5b
9ce0edf032f53625f23adc58c81ce521313121e39d97ad3c87c153de73bd555b
6dd75ccb3192bf213021a951e547df5fcb2133342157543949688d3fb63983da
fa9f25a96a712fc454c9b9f31a248532e7753e184b29e293997f6b37c251ffbc
5256b598b477c3748c9523a41454d563eaa7cf28125afca315d23b1521313121
82761f252dbddd112e65ff683358670fd211416917551393523fff2a3b40d92b
65f65ba345c583a5c4fec58c90fb213334213dfcfc23015f21313321d2cfb8fe
60bc21313321f52fbd93793485931b930697431c79ea6fec61d198a344e2ba42
d239b3ad8946e6295944700fd41b5c98dc875d7f7bd3dfeb31528b6aa6c6108b
59a738d93bf75918b7c4213131219f466f8d06b830a5b5c7fb34598bb5a6d3ac
b87ee821333921db3714cbe48ba1ea04adac772ed075b8e7d85d304da5fa3b21
31312101c2ecb3d6f368f7bcf82821313321378b19b3213334219c4501213130
21e7a9b04fda3864909ec6f0ff44698e21313321732e606fe51ee0830e999e51
1fc952ba68ee4eb490982131363021cb59a6cf2ef19e9db5ba9b2dd3797bb52f
33f38cbe3e988fffe5f8da03dc5afae50ee8ed537c9ba990bfe9f6d5945bf3f0
459f4a790250c13bfa2c804e8637d3544fcd0608a3eb4828b8a5dab5c2213334
214e5c2dc4043a9414a2d76f6d28a4fa56ffacc00162b93f64da9f2131332132
a57c08c113f082def89eed9e29213021182cfb21392125c6549e65e6f17a51ac
4fa5cc166f7da3213136302117f576ff6a48ee92c1dfd0bd21313021642f8167
db75c2b225ab83043885184e4ff469d7e39b25ac3ddb48a390eb235f36afac12
d0d2021e8a315808fa82ca2c38478af76c0ffc76618ee6df451a7a91bbf92130
2115b11a97b79e9efb3cde21392155b9b41595ef213021eec141a4283582dfa4
6e9490506653beeb3321333921e237533fd5bdb9442c21302143f7ab7a7c9138
4e781a80a88cd3eb01d7e3d84f6d56a1ba6552213131210458c162012c89d930
d9c696c06f1c11f250650ffee0b771213133215dd12da690c3b001fe2444eae9
2131322156905fa64c6c544221313021053b96cd956773dc424d36113b398c21
302117a1b9b4213132213faa74e566771897f970ef5b0ee14682ac86dbccc4d7
6370fab1f334398eb5feba0235caf3c88ccdb3e23321333921eedb165a7dff99
8bbd46c9168a3ee62131312156f2d2a36fc87196ee5e1485454b8ab9f4cca9c9
6e8324f2d5f52c8cbc8fdd5bae213136302115765e49244b2472faeaa4b5c789
aed963bbce9a168140b0a1b1c26dde0fafd83b531d83213921072f0fcdfd0821
3339215c79771cc26c66852f8433c583c0762a593bda07feac8ccf9c213921ad
6b3aa2b64782f493d46fef81cf37e75a676abf7df91fd85262faebbd5ce4d484
e61e339c2130212e407c33497d43eeacf3311f6de3e088911df05c7c394e7fd1
c6088bb131fd69205cc459e58ddee0244c16e7e21dba986021313121549abf8e
264d6121333421248a6752ad25fe5bf1e980701c6bed586198328eb7f2d3b39c
96d2386f95be6021333321eacd369b348be344927a9a44ea7c824abfbfc82131
3221761e6e45eef09aa983ed0881f88f213136302134c79bf6bce5c1213921e3
c35f41a2f4be3763bcc452bfef746612c0989d10cba77f597c944b9c21392119
d6c28e59d7d21be413e2e5641e2c51e03d8706bcf613d054511f952569c983b5
756a994eb06112ffd6db4928ad73b61c53feac4aea9523f99d7e7a1fe710bc21
313021213334214ecf16396e8aa4da31cffcd5f36e5c2b3421333921628fa539
e7393c8b59f4419421313321148cc2101c1da8213130210e993ba421313121d2
ad7ac8ff1b05b7443e5abe7a39566eb340cc122a7cb9dd4bb2a6213334213121
31363021b1d4e07c9e152ab517e36cabbd21313321f733722131322121333921
2a3439c6a11e9f21333921b921313221be21333321b477676edfba213921f07f
4e299ffbe816c2213130218799c5fa07c4306f96051f7e069633cefd21313221
c42f2d7866f9a69c45318b5d4421313321c7ca7e2131363021795ff0cae4df03
f9134881a1f0847afe864d92fa9a97b7213133212f44e8f3aa937dd026bde76b
1b689a652ccbe8ce506084fbee4b04e9b31f25396ec680315321333321d6aab5
d372d52ea52884d2e733065b57dbc718a88e36bd90e77476edb3d2a1f8caf405
04bce64ff9eaf774b158b740b07f814d5b33d9ec1b0110452133342118057d91
85d87f9094d96dd3de61be78653fec1b36fb4a896f1d14126e0817b5bb2f1c5d
6df50584bacb65f74f5180213333216aa5d5a8422e5bf371565784c45bb73f4e
ce9f6f151721302152b7e9d11d21333921dc15231dd03381cabd9e420169c7b1
Encrypted(6E6D524CDFC70307DA084FF6A46B64D196DBE7FC)
1340f94175c693158058213131219e1e23865e118bad8e9affd8d7213131213c99
112d7d1cfa95177ded61ce481d15386a6ca6d5b79ef426b17973d69524d97291
d7183481c4a12f6ac328ab634d8cbefdd1c8eaae9b05c43943dd431374213339
21943f71e495a1eed334aa61bce437e7e2e5d89e1c6ef4665dcae5af3cfb74a1
af9d213021a3b8996c0710a16b3c3853e3d480df16e12943a5f43f6403dd321d
d8cc39213921aa21313021cd937021333421444af697c09efd3d60b521313630
21213132217d66c721313221da42948c213130218b213333217d902131322171
050f2bdfee154de9b6d23eaeae15033942fd6b2130217d6daaf10f7693134c57
ce296c692379742e37b44c1b6cc889b3213921f43b551fa3eeff6cb830cb6858
c605ccedbe56d9fefff4f56dc5d99d3dd776cc8b1c7c1271cac988c37339a1bc
df252d23107c4582ef2af4e80fa5fccf304525736711190ea1213136302124e8
ed4ecadfee79016ec1e35fc5ca5526d7847a61b367579f3c2131322138404e67
bd283ada3b8f5ccda198a3e392d817cdd8fb31e0dcd2e261d3dc51213132217e
f211d15aaa242131302132498a5c1c89d107fd1c8ccd1ef81159bd2a85aaf81d
7b717b8758f09f8c57058836317ca170e17ee6ea73ce4bd50f13fdc55e3e69c8
0293bc939b116e3886aeb3f4f24523dfabcfe05fa38eb5877dbfb4ae447ddd19
91e5c74d3396b01fa27c0fa39d90ecccd4dca75b3c6fb14e21333921285b6454
d77cc0491934b0f82139212c141580a1b756a17bd68e5058e212c7213021df66
3df3448fd18fe1fc24a30565641d54e35d41626fe74e61fb5510881aae162133
392152fbc86023d62855e92590a7838c9df73f8a445afe3a2f97ffd8b291f821
313021d59a8893195b92b51dfdb11df5f08182a25c4bbfa64adf902bded09e8c
c04311da37a157b1f13601c27bdfe42fe38b8921313321497e4ba16a94015721
313321be5275501c865bfe5d40ce9fc2011c4132dbb957e3322e642131312121
3921f283e11de10876751c63ecb9f0cac362865055a7a77c19169e4ee2085595
4a35e3dfc54d8b2f82124ae2d2cf72e4cd3b4d6c3cc33541c0d682cde9213130
2118c431308050464ffb8302b999be60d0df81213130212fe92f6b4f2bf45959
96b44bfcae435f2a7f3f3dcb4ce93c8dd0213131213db39c46fa76383ab88b1d
9894a14e0e875142833abd3d789c83504b2cec45cff029b5551e9521313321d4
ee7be02e23014015fffb7504494db9f4ce11ec67dbf314cd6fbcfefd7a213131
21d564ae2ff00f21333321742131322153fb8a55808f15bdda8a86efb676f05a
011b2bba67a86ab82d4cb44aa5503818213333218f96213339214d690313ef11
1bcf0859dd92d59be21801d577eb5570ef6e1effdb3773213136302130d51ca4
961ec5ef1a164e44c64ade38821bdd25a7910fa1e98174ba947f21333321d5a5
f282c5b7477befe0e9d8e04fe6c8dced814c89cb84a92e182e25b406f2213136
302128ba9031ac7b99d6a67e6ea5f174046d9cbf6d725c305c6b6cd037d32f50
21313021bc6b6ce8c971b79fc0f81aac6b5ca9b5e121313221a7a94b38213132
2195ae17621c3d6e213921026ee3e53ae33887d461d479df9f2e644f1a15fb58
3f4f9b292e3bff6545213132213bd36ef6f34cda4e041b68ddf696213021a4d6
d085ba238c2d3bd7b0af11d590394c1d615a946569c6448edd3bff752d1fd2d2
776d93d26b4be92f72e71de14df9e7cf323ea4356e64ae249255e8289ae9c890
f3c1797fba3266a9a657b850f3d12dbf213132212f5825a2291eff21302106ec
26eb8d41eb6c9c46dd9f1ca305463e2131332175cfb8c9cb52d782cc18f33c21
33332170579aae213921ce84737131ee105e2d5966d142ce21313221a885e1fe
f6909aaa33b780dff8bef64b777a213132216d662551d5958f2131322172cdaf
b881f7b97fff8fb5bc4b2078de8c070e7c70a404e004c7d067eeb778f332dd33
ffbd9ad89e8cd2f8cc06789f1d7316abb40221313021d3f53768e88b9b33a2f4
3e917d4bf2f2a729454390b99f8f693f792a37468b264357213133213bf4e8d4
dfaf34a1f321313121cdc72ca37c03eb5256c6df1eac11f8bfd93e747d4b8c5f
8c29315c9f4226a221313321d2e9b1bd067e655e1d3e2441db50c53d8336e562
213021c6728348e0c79a213131218a2139213a312e442fffbc1a3bf7a4bc119e
f254b0b8d0680389bdb78ebd05cbb8900251e0f615559494b3100687ad1fd037
c25d973ec03a25a87d213921d3b921313021188dd3b088ef34213921d9bd1fc7
359f2581ea6c73a5f32a857313f18e872504ee6275801965e6d34fb4e4a37353
a5f624a198db754071acce21313630210391ae96980fb0eaef35379270412fb3
1265e17b29032a2bd39d729426e05cdbed855d9a86f918a721392121333321ba
a9d5050e531d37d808c86d9fd801da298f94f6ff165a2e9c5547b1d01fc5ab7e
c821333921baf0213334218821313221eda3a262344d2e01b2fa1ab4f21a6a64
4a9d67a255f89c35e181c51e6eef7f968c5767bdd2db3cf4213131213cb725d2
6663afda1424d1d3a4df9d2133342131
Encrypted(251E86BC6BD8063A46228F6595F6607C9F0A6911)
d49b83c5e12130213f82e46d1312fddb1e13638981bd82d87d213921b3df579043
122a6ec02ee696a8cd82b52f8607d91121313121f08dd9c27cc7c4e1edf26fbc
69074f7c695f14de7337a3bcd35646100f1f31a1cc213132213bff31ef96b3d1
437dfb551b5ff3f14b40a684a6b66a16948b5778b49f21313121512880cddcee
5b2ae2f26cc8213921d15bc46d3b4d6545e725ded51f21333921dc6cc9a9de7d
e0f9cdc0176afc1c9491bfe967e5faa6a9df064099563dc4e31494e64e84bed8
77983d8e5a4c5296c7197598ddfba31da778602d2af01df2bbcd692a25ec4e3d
f843788c75e58f68213021a50888db63477bb1e22131322139f5c9ccde213133
21b09e53c3168b3402cd2133332164c50129feef543e7d231415ef1325ba2f8a
68aa9cfee66f39e8d82068b07b6b9236b56cc6bb57115de62612a10101c164bd
d3aeed8d0f962b0fbbe2980f2846383cbf21313630212e88908ca249ead73640
7beb2021333421e3376c213921e330bc8e213921c0071128ec6949e6dac54fe9
c349852a181b81269cff935230e0b2ba08e37185f866213131214d66fade83ff
f521313021035f1e84d5627a39796b64d8c27c89dc239d5e412dce115e034997
a32d213133213e3a8496c1741aa829a221333321213132216fabfa89e51c10fc
5303ee3717e22133332166939a43481ad9ebcaa5df0121313221ce9f333af22f
21333421cbd7fdfb3f82a74e2bc0d7dcbb876108371498297cd5213334211890
35327b2131363021241a1341bb206e3dc517a4bb3c4bd982f3713b24a569af64
62a22502c76a7483852139216b7cfb6378bc0730467ff474a915e205f2bff8c3
4a4a1f2ccaf9322f8cc47e2e2b299280b9ace1d8
Encrypted(69B1A2A111F9E3D9B5FC25EDD74DB7DF183E0AC3)
c5b4b287c76fb171753f5e89e5a9eb213339219813236c7bee7c8a716c76213131
2121313221b6855f34996221333421656d0116442133332172f8e921313221e2
491eadef4df25ad5484a90718fde34bfcec858f207b15f19a882ecae86c92131
3221101bbf052f1912a5c2601b97b8aa57915643769cd4da197d35d210ccf5d9
63d704802a51f6f71b37d91d404b79db5c726dfebe9516677e2af1daa8e04076
3480fd5ca8a1cce771f48c49086af1193063b61ce3ffdac3bf2130215b6e63d8
1e8e756b28d4d4f21fe5bf8395b9213130213ff64c1ff3076b87196aa9dbe006
459eca3b7e234c5777fef58f21313021f6230eb864ef5a14383cce347d305098
e159b0dbe298bdb1bff2d7c94deb9659a9cc3624b9b16b15330fde42ea915413
2e58b26a8ac2c5fa2ce68af7fe0fb4b13746aaf5124f77c17956fec63b141a24
a8b834fbbb6555ea2c92d492c990b7c044c2af9421313221f0addb51a7a4c815
ed213339218359057bbc533d25ca06969553f5ae15645bf4fb2b6086207a96d0
2988de3d07ba19cb6371888f1d85153ae9cade29bd64bd1bdddac3ac9a5b9029
8201d9405f899043e5c7991332b8f9f9ebce7f31708f7a2133392163b2213131
216613e5a16e1f288d91adf01c05974e080fe3d7404fd598213921af21333921
be890ff2b0
Following the idea of [[using skiplists|Skip List with Edge Information]], we construct a balanced tree over a list corresponding to the ordered traversal of all the nodes in the original tree. Beyond that, we have a balanced tree structure on top of each list corresponding to the lists consisting of elements of the same type.
A lookup would consist of navigating your way through the typed balance tree (of height $O(\log n_t)$) to find the first and last element in a subtree of the original tree including all nodes. To do this, we need to make a comparison between two arbitrary nodes in the original list at each step - this is achieved by spending $O(\log n)$ time for each comparison by consulting the overall balanced tree (using a rank trick of comparing subtree sizes stored with each internal node).
Once the first and last elements of a given type are found, the rest can be returned in $O(r)$ time by navigating the typed balanced tree.
|>|!Space and Time Complexity|
|!Space| $O(n)$ |
|!Lookup|$O(\log n \cdot \log n_t) + O(r)$|
|!Insert|$O(\log n) + O(k\cdot \log n_t)$ |
|!Delete|$O(\log n) + O(k\cdot \log n_t)$ |
Encrypted(2EF6FB175DBBF698BEB007DAD7D3D40C913257CE)
6128979966975bb33b360358e7a3ab117b1557a5a64cd7c67ac0bf7a3145ecdf89
5501a69aa1eaa6966d75d59c4bd15db0753bec3ef63f213334215a0121313021
c72fdb9344f68c7cb93e3cf4eb20f5493d5a49bd5b213131219475a6bd2b4199
2bfac389a6c829e0502cb1b8f6b084fab3631d01af2e2096e2608f25a4b5cb9a
d215792130210eaee0500421333321f6de17b769c91cef7d371ee50f13859019
b2e59a2929e7cac13c07f42131332168673fb54bceb32fbb35f079f1b4e93c6e
01c0ed9f04bc21333421333a3d7438afd0e5524dfa31d821333421f38b188a86
ca50655ceac3a11919e2195c295efa38e04efba2d7141825b62303c69bf78273
8a559017057333b51582acc75e373dbecbb0d2f6cdba982588a82a33d2acef4b
8c7b1505b65ea40582242df03505b94eb1e35ed65963954c9b21392151a51412
d407bb0430189f53873a942139211489e874f8aef476aa9337ab1049ee20a13b
ee653111509de1a2cdbbd0583b6e44ca213333214885626dd804ff89c9d6cdd7
685acedd48909fadda9bad7df449775cba2e213021ace9df8f449b85845c4da1
4644173937e62bf73dbf7044c446d09832a84dd9dc80b9bd1bc2213334212c29
d045eda8ed3252f9315910e830c21fd66d5b2fcbe10eec5cc2ec5174ddad6fcf
68e3b5edd1c0d5cd213021e77a5745e658c928e761978a8984b54697a1b11618
a992d92131363021957041d51d148bfe2056ab39585125848861600841672a54
2a6c1576dc13180fea1b15a8f521333321bf8b01fdc202cd999a120e94a78d56
9645b2a411dc7f89e6a7e2dfe7911bf2d0d7e4ff73e795baa92b8f61e1b6cdc9
bd9dc4f4dc53c925c47ebcabd2e643030e1c6b98338893
Encrypted(B8EE49AE65284AE550E6EB50DFDAA136698BB587)
8e05644131cfacb24e19e139a1a7d1ed21313221bf79bd21333921d458dd7c2047
1e9bfd606194ead0a75dfa97bad183a38036b21a3716d519db67fb740f7d6aab
f87c9cbe8cae7a2133342180a7b6c5791bf71cb7b2604895c94217ba21313021
355030be975e7412941a451667c2c456282e9671e145e1c9213339213eb81d0e
848fcfab07f05bb64bac9773adc94ef9ee71e29bcd636604ee5aebdb9fddcdb9
4292b775b873ec441c88af7f85981ae5aeda3b9bbdbe497cb8e81e5d64213131
21361e791c5934a8e1ab32520eae4a24977dfd295399a82a44ef21333321d3d5
dd3f92fad3c1dc77ac14cbfac4772d1fdf5e301a4c1ab7b693d0d803f4f7f6d7
2133332148795d981eebc711ed07d5213339212b3be2991cea16937021313630
21a4eedce553213339213a63e460d668a72b17fac37bc8afe262538428ffdc99
a637ce8feb2bd79cdcd2fb55b4f081fe4e49ac66e6a310bc2b633e476c35a93b
e9e77069ef80115a735868a12bba7fab40554674749b776bc12f5751d154da4a
921921313121a49aea8f03b321333921248f7658cf440e2f6b9e02431d6ce662
a144f6213130216b116932ab416f9cec5136213131212428b692a38a971eeeab
87e94d1b748c1066b975ae695cdd1b963fbedac594babc6c34f4db06874c9c21
313630211ed5e44890d61e1be1feedd6f7884aff7b9821313630218d4b292c9f
9b7918a11061488ab3bf16999788636acd3b7dd6b3cf21313221bc71e9d8ea41
2e8233dd81e46f284546a92dac6049354759399c2bb48c6f51b55be1a29f42b0
ee2a6c5ae1dc21333421f150319506f47ab7d368a440d1e66b11f06f1da5aae5
8a40c2d12aabd54c403acd0692e2d879e8213132211affc897dc48d852e659e7
74ac31b9bc653d534b90b41014b9cc01167cde06c6304566f7d161abb76a4b57
bd2bd13d1fa69495bb7069086049ca6ba5fc6c5b066121313121d2c8b7634e03
244cff6a856d2ddcdfd13e4ae3ea55e02dc5e74c6747d1e6d982b45ff70e4c1a
f57c06ec385f68b91d6e6a9005f3d125c1fc1e316ff8638b3342590574e7969f
b9dd67c07fdb21313121fefb1d65814020c7e9e6a86167d321313121e0bea9f5
6961c3eb86cf83d4518b65c5969e752131322118897b251ff166e8f221333321
26544a675291592bf421333421dce332fb48d21b429fc4343497c321313121d7
e3fab4d9b3e28834f5547ddc213921fb6ed76996c33080213339217780bd743a
2b29c51cbd5eef02bec2fa5f6addeccc4c66ef316ed7de68f81e20e43749fd5b
21333421c1d6fdc72131332146d1eba6364e1a5040489a5a1fa8e1980fa8e0d7
52603bf435d7af6a70c2c1826ed8aac66634aed6064a62824949d398c7ac47ca
c437cd944bca1bca607c2999f234ef904ae998213130217cb4932ef4b89b75fb
7099512f0264665390857fa408459f494f9c428eceb6529f3ce6e1caa5bb153e
94196808ec21333421d2140137ddd1dbdc1f30b4c04a3fccc5c064e6e91c8478
fc1ed8bc1fb321313630216d2e213132217b3cf35d451fb7adfea1433a0391d4
fb01a4bb01753e2d1506bb80c7d8b89233ba872aeb08d121333421678f213334
21667f8dc329d0e0d4a244b84ecb5d396c9304616421313221ab7a3ddf784099
97bdddadb0256688f1ac85fcd79bf17a5e3bf65373ca86e377d7c174c9a7d608
4da70ff4195e213921ed77bb553b9b7d73d03b386bb39e5cecaa77ad490fd6de
3c6f7cd3a39d21313021b12b026a1c0eec3d8d55eded7bcdf1db081733aea446
aae2db12105a37df47fecd3ec03486074f17abb823e0e0894dcd5ae42f61d9fe
f00780add9f1c75ef68158574340f5cdecf5835e65d106836b4fe111dc9dc6ef
8d8db85f7dee5da9e2c6243e5cbecd67173930fd4c712bc43c8e0468a8591018
e908d45679c04a559c8e903ced828693474b213334212133332162c4c38b95eb
2b51cf70603e62fde885327aad1e97559de9d6e9d9928270eed349e26b213339
2196aff74ddcbcf7e49502d26b049991ea60ae3ee1d52e47d9d2d1c0025d02c5
80de828ec9a19499f5f8e9aa7bfb919f1cf9af4d16f8663163b05e5d61232477
de9ea85d61acbb280e58d056d9524cdf81e90e1f10511d969d05bc32dbbd0821
3136302154fa94d1987455cc3948abd88b19c1bc491e21313221a53776f82c3f
21313221315feb70d88c543cc4fa1c21333421963c853e7a7fa224a4af46665b
8b83ea7d7b7bd437b77eb84b954b6677b4e1a4fffc3e511e23a521333321488d
ad4e24c7f1ed6413c0f4a2b66e2b50cdb964c9538a86781f21392135033a6640
4eacef0e115ee1cdce601a21333421df2a32ce5e0e2a3ac2ba213136302111d6
f7e87a84ffd0e3ccd8198d44262c26d8425b7496a7b2cd196c6b74194a78b8b1
8a7f1230483ef735bf7dc7159053825cdf594ac621302137145aa68e21333321
213021a621313121cc67a74a16599012c4d42483ebf610f8b121313630219394
21333421af5dffc33ef22130212fee9e6f1837bcff4cca82287ad998126eeb94
e370c4aedbefc59e94860851902ffd4ae24e3efa3bd1e6e9439d1b23ad8da17c
75b5625bb3befdc1c1e5c4df5a90c2cdee83811eaeb692fc39ebd8c6b5b55a2e
decac51c99c854384cd2566335cf92a3c6d552d6f297c221333921ab2c429bf1
9ce858b2bdd959be6ba64aba34f4305adbf6a21fa4ac496975e71c46fa2b78f9
0796d8c59e5f86d33ff5ed824503a3579d2aefcb9e2edb5e36806f3197c08a28
213021889136c34e76a3d532064dc3ad04de8a8317cc4b8aeb3221333421cefe
96f22131363021dd6c24f441b449759ec3c8b501dec98da85be77271e2afeed7
cbe955ee4fd9ae81c68026fb39567a72668d3afc6c376d3e04eea9a888d3072b
9afca47537bb6a3b53dc11acdec38dce3d99b6b67a7efe7c67666dedc4ab2856
db94d9d67af0daf2fb4195db4e3be1206030cf26e22a21313121b2467c08caad
d06a038786cd7efb18e4ec24f4902392ecbbea2139216b76335aa6b401c78f2e
e3c9f995d4a7a5af03a6bb454644b6becbb08a3150eebeb2ea0f257736b24681
fbdbb26f5b04213133213394a6c649145d1208f7887cac597fd5914775be4ee7
fe0541c87a01a3213132219b3dfbeaf8539534b94772436f3678027dbd942131
3630212133332195fe1aac23e9b8399762c4f4121f87e8bec445ffb38e208ab3
753e54dd41394cdea63f575ce2213921ec5e61040817ce6f4794bece6f8e3d45
4a1b7c48d5f69b2b21313021ef307fde1bdeaf213921a8c73572bd95e83047f8
3c75025beae27c5c6d18774eea2131312152f41df8f5fb31e22913ebdfbd3c9a
56113e9642d7d1aa834843dbd17242ea782133342173369f4fe07cfcb23da161
534ab88595a31fa7cb93b38afba9dc6521333321c7d7afd507131e1da7bad421
33332155a42131363021edccc97f1959418f0402d4ab8316d794fdd1a78599d3
b6e273befbb37c9977dd49f134ec4a932e2a814f573f5b7f6b1f14fb4b95f94f
31c3bebec464729580b21759794db8925ac2aec015e22dfe015966b28cbc01d4
21333421c421302118c548302da4213133211a3e7c2c2fe36e2aa41c5b69a36a
a599b8fce3f951bfec5b427cce5d9373e51581a87ebb95d1c31ce2a953b4fbe3
2a703c713c21313630218f4db4fdc054b64f28529315cec721392121333421fc
1324c9810ef2330773741234a89f9b87708ff9ebfa899a7c2b1d21333321bc6c
74ff56726167ff8584a20405af14f1d6fa4a247f59e0ba2da702ab21313221fe
d1ab7fe1164a6606a6e3213131212e1d7c
/***
|''Name:''|CryptoFunctionsPlugin|
|''Description:''|Support for cryptographic functions|
***/
//{{{
if(!version.extensions.CryptoFunctionsPlugin) {
version.extensions.CryptoFunctionsPlugin = {installed:true};
//--
//-- Crypto functions and associated conversion routines
//--
// Crypto "namespace"
function Crypto() {}
// Convert a string to an array of big-endian 32-bit words
Crypto.strToBe32s = function(str)
{
var be = Array();
var len = Math.floor(str.length/4);
var i, j;
for(i=0, j=0; i<len; i++, j+=4) {
be[i] = ((str.charCodeAt(j)&0xff) << 24)|((str.charCodeAt(j+1)&0xff) << 16)|((str.charCodeAt(j+2)&0xff) << 8)|(str.charCodeAt(j+3)&0xff);
}
while (j<str.length) {
be[j>>2] |= (str.charCodeAt(j)&0xff)<<(24-(j*8)%32);
j++;
}
return be;
};
// Convert an array of big-endian 32-bit words to a string
Crypto.be32sToStr = function(be)
{
var str = "";
for(var i=0;i<be.length*32;i+=8)
str += String.fromCharCode((be[i>>5]>>>(24-i%32)) & 0xff);
return str;
};
// Convert an array of big-endian 32-bit words to a hex string
Crypto.be32sToHex = function(be)
{
var hex = "0123456789ABCDEF";
var str = "";
for(var i=0;i<be.length*4;i++)
str += hex.charAt((be[i>>2]>>((3-i%4)*8+4))&0xF) + hex.charAt((be[i>>2]>>((3-i%4)*8))&0xF);
return str;
};
// Return, in hex, the SHA-1 hash of a string
Crypto.hexSha1Str = function(str)
{
return Crypto.be32sToHex(Crypto.sha1Str(str));
};
// Return the SHA-1 hash of a string
Crypto.sha1Str = function(str)
{
return Crypto.sha1(Crypto.strToBe32s(str),str.length);
};
// Calculate the SHA-1 hash of an array of blen bytes of big-endian 32-bit words
Crypto.sha1 = function(x,blen)
{
// Add 32-bit integers, wrapping at 32 bits
add32 = function(a,b)
{
var lsw = (a&0xFFFF)+(b&0xFFFF);
var msw = (a>>16)+(b>>16)+(lsw>>16);
return (msw<<16)|(lsw&0xFFFF);
};
// Add five 32-bit integers, wrapping at 32 bits
add32x5 = function(a,b,c,d,e)
{
var lsw = (a&0xFFFF)+(b&0xFFFF)+(c&0xFFFF)+(d&0xFFFF)+(e&0xFFFF);
var msw = (a>>16)+(b>>16)+(c>>16)+(d>>16)+(e>>16)+(lsw>>16);
return (msw<<16)|(lsw&0xFFFF);
};
// Bitwise rotate left a 32-bit integer by 1 bit
rol32 = function(n)
{
return (n>>>31)|(n<<1);
};
var len = blen*8;
// Append padding so length in bits is 448 mod 512
x[len>>5] |= 0x80 << (24-len%32);
// Append length
x[((len+64>>9)<<4)+15] = len;
var w = Array(80);
var k1 = 0x5A827999;
var k2 = 0x6ED9EBA1;
var k3 = 0x8F1BBCDC;
var k4 = 0xCA62C1D6;
var h0 = 0x67452301;
var h1 = 0xEFCDAB89;
var h2 = 0x98BADCFE;
var h3 = 0x10325476;
var h4 = 0xC3D2E1F0;
for(var i=0;i<x.length;i+=16) {
var j,t;
var a = h0;
var b = h1;
var c = h2;
var d = h3;
var e = h4;
for(j = 0;j<16;j++) {
w[j] = x[i+j];
t = add32x5(e,(a>>>27)|(a<<5),d^(b&(c^d)),w[j],k1);
e=d; d=c; c=(b>>>2)|(b<<30); b=a; a = t;
}
for(j=16;j<20;j++) {
w[j] = rol32(w[j-3]^w[j-8]^w[j-14]^w[j-16]);
t = add32x5(e,(a>>>27)|(a<<5),d^(b&(c^d)),w[j],k1);
e=d; d=c; c=(b>>>2)|(b<<30); b=a; a = t;
}
for(j=20;j<40;j++) {
w[j] = rol32(w[j-3]^w[j-8]^w[j-14]^w[j-16]);
t = add32x5(e,(a>>>27)|(a<<5),b^c^d,w[j],k2);
e=d; d=c; c=(b>>>2)|(b<<30); b=a; a = t;
}
for(j=40;j<60;j++) {
w[j] = rol32(w[j-3]^w[j-8]^w[j-14]^w[j-16]);
t = add32x5(e,(a>>>27)|(a<<5),(b&c)|(d&(b|c)),w[j],k3);
e=d; d=c; c=(b>>>2)|(b<<30); b=a; a = t;
}
for(j=60;j<80;j++) {
w[j] = rol32(w[j-3]^w[j-8]^w[j-14]^w[j-16]);
t = add32x5(e,(a>>>27)|(a<<5),b^c^d,w[j],k4);
e=d; d=c; c=(b>>>2)|(b<<30); b=a; a = t;
}
h0 = add32(h0,a);
h1 = add32(h1,b);
h2 = add32(h2,c);
h3 = add32(h3,d);
h4 = add32(h4,e);
}
return Array(h0,h1,h2,h3,h4);
};
}
//}}}
Encrypted(AF3F2F108A6AC5F9CE064A8BDEBE1D4A46B39A3F)
2c3dced55f5a08c8c83cbd79ff38593e4181344db38496a8cd1ac1989eb1798f03
ff7c62baccdd735579d464af42f84bfda4fff14d643e8af75914e4d7348a9e5a
eb7540f74ac5c7aee9c08fbcfd67951f8c876644c0ee49599a61f55032ec237e
fa06fee8213021e28b3af0afe9692c9b179114213339215f344c500733237c1a
c0128a3dad5a05b1641e213021296ce7353d53e916d5582133342177e05e5b5b
8586b341891ace5dc54dba602133392192f3a235bf549bc20f23c6eae850ee79
78e193ffaeccb2bc853b685eea47182cae77d3a13c84f705c66f3c21313221cf
ce1017d01b1b78d84875bca61ade213333214970e1d46f4cd5a3a17753bbe684
668625cdb41cd6dda6be21333921d349ed315cb7f8d51953f98cf153173ae561
c16ee2374c30cd76ef412d6af921313321146563c4c2307c7e1aa4c5bfa7d9af
2093942ea6447dab2d81f8c7a63bed44d8262bda77d5afda5c6feb655682f2a4
f7cae21c30958a509118434989e4d8729932e9fb73fabf93dfdeae1334258cad
21333921f873ddd3e91fd403d65e8cbc213333219621313021fdce71b0517dd9
3b390674429ffa1c99f357ac213131211ff0eee9e56521313321e234f818e382
e6c5fc21313630212c45b3
Information coming soon...
Encrypted(6449840D624C8C0321B676B1BB6DACBE4E967AF4)
c61e2afcfd3f776a4a20bf817e37a7a61914b904ab156870c14a4162e089105d03
de5a5a73ab85ea131f700ff53db62bc3acb62df7b8326ec9824a117c651c5c9e
195572e0bec9de63b321333421921b3ec70ffe2b664304847eafbf213021b98c
badd46f38679e264b1c087d448a915e5edeb8b199f5dd9109251a7426ae4042d
213130215dd17103eea7ef77f8e1a64baf817735a82cdee4d22316466fee33df
0483124ed488bcadd050ef7cbf766fc2152131363021ffd239dbe0e76c77e153
0fc63d21313221c3a578af1746ea86aa3ceb019178d3e2ee77b32e7cfaf5a521
333321499929f186d29459af597a895de31d21313630218a8240895715d476ca
75ce869138edda58cb3b461a95a8c7131021333921b840bc213921ae9cc704b1
e577957ece68a658c8269e521d193ae2b8337cf5daf6b4c8089921333421a7fd
23dc6c8155dbc39c6853b20356aebb612660819b9ddf6c98a45e15145a676ade
1055627891c1aa4a9656a34a0665198fe32db980ccc9c4a583b25e4fc97634d6
6a213130215ee0a5f3d1dfdf
Encrypted(D7A4D34EAF719D51A5DA0F236D02941961498014)
e221333321e5dac8bf213131214bd441c06ad9bbe95e23a1c8a2995db7c2134fd7
a56af7336cc732f7fdb1359f9370f256eb2131363021f83cfd5d1c838bcf7081
c6aea49045db458d80fe636ddfb63c7b3fe2631f0e67295b79e66bb7326eb348
50b293fd2131332113bb2f16f963c023213136302119d36e8bfe7e1fddba519f
b8c9bfbb5896d594aea4ed37246ce7cd8c8cedf1084889b2a518c61666da9b40
84506afe21333321ceb44f30f8c3cc559cd7f2a96138c91389d47d90c85b2d6a
c8a49662909636cf43753b9a5eff8b5639b65955515c4d958bc3052e6b5a1d9e
20af6046b8f368626dca93ca259d2be9123c54ae738f3c7b9c030181bcb75bce
576753e79b604220ab5804a2593ac943a774761a93b6e58bd0e43eaa7b11ef36
87ae406eaef6a234ff7ace603772bc2606d8318f7ab27f9947c599b1532b8353
a3f3597f65930838f38ed76ec426d3891a9ab8b94368a85828c2213021204736
1e315c458cbbaed57608e679edebfd9ea59221313321b9dab1989e735b213131
214340c62dc62ed2d204586ab16cfbc65743d90659213021cf2f4c5997c09955
064740459788a2b007127b98790ed4d82a10851c247f12beebc01411e8996ab9
37e988e342b07178f1c3ddad2139211d92afb77712ea961a2139213b7dd47275
dcddbe7a37f8ae30ee64d5cd213334212130211855455e08063b0ec0b6a95c5d
5c785039e6c71c891b0f21392144b23c9afa6a4c801b7d4f89e74c4599990499
2ba5bc915ae9cf56929480a51bd134c221313221c74c44702f6d11c5f7213334
21c8ff4816e4f4aea15680881d54ab41d10682b5fb7c6a11636ac62688ded402
ca03c9efd4e18b6f13c15ea919ddf4ecdd5e307d7164087b48dfad2c59374343
712fe441213333216597df50453f99a4458dd9c1dd433e213921d4e9becec6a4
86e129ad416b1e6201596c8510505b6c6728b66c989c451bb6213130211c4fb4
181c547156aebaea461d9f76255a19f8ccebe49276d42131363021bc8d1fe23d
819b621efa213333214f43e72b2130215fd4e42dcb36eadb213132210216251f
fb75ec97f528d79079fb167a16039b7191ea9d12d64bb5f12d3f6dc4f359c5ab
14420207025221313221268b21313121aa0efc3f469735d9d97dd92512787666
c7b6445b30797ebe486507614a03a64a78829a21333421e1182131302176f28b
9b6588a733cab9265f59d90fa8034ad92c398cca0f2a99d18d853731dc76bf9e
4349ef6d425c6bbc7467f937ff3b213021193f0eb337618fea56f3c5aeadb5ec
6149779aa88e4ad46059e441608e2d879786a42beecc5f479cee2b05d8fd1207
8ba792077687d2d072e30626a846357ad1ef94a495a2b2740e2e2043526c7384
d65e4f557904c86a267ca99982b98dc551a32be459bc2f570621313021213131
21bae121333321e146f47a47ab6eeb073d56aadb9235454de0f77685bd989e47
e4834193bb8ef32376642e7a7f9130e167a2c596302ae02f8ed29d62c8857703
81e2f9a4ddb2440551b844922139212c5df87689ee39b0acd668cf917c5c8cc6
87c6d2c547dac7b528a5f1b68f1202b8a149805b146390e6b86eb6b23efbf750
5fedf8c1fd853ae3e45a2131332183417395b7f5622f8bf23f87f8c81dd98a37
838cad16b13752879e7202982f5e4d561f820392aca21dbeb0f4f73f6a57ca48
6eb4b3598df6f2f4420f4ac35af92131363021533c2e9926ebbabc8815796f9a
6b7c9454afa54d0475f2c828712faa05becdf84921333921cf615c06fc5cf3b7
4414721193a1d804eb17d886991b742869856d1c403655a1981d46f77e2bf64d
426675fc8be54ad2733a90ac669c1ee39cec5a7d9c78b325ca9bca736469ee15
c2555e5821313121c8eb21313021b5cb4c9321313021f184e50221333321bb80
ac8575ae4af888be603171fe24f9a22133392162a9076ad1d9c98edefe688217
1f51358fde81832133392126fb4715b189fb790f21333321643bf9048724d059
682130216e474311b66816e0ba83c59d36e3d1b0594832015ffbd8a6878d138d
7251814a321726bcee420fd121313021e63ee0375b794ac4343a0e25d6d68a8a
ac6d710f319b9e2a447b67c2ddb2e7f429ac53bc5f1b8660906b16f84e5695da
647b35ae619d07a7e12de5a6078899daaf17486b5353532131363021e4f34b1d
c27b253083ce2130212c90a6f6e7cb2130215c21313630218abb34ee6ba39c57
b8e350e7d32c9c083f2c9405020fb5c3c4e067a681875cf0eeff851ad41043f3
9ba9b54d971b8cf1e6e2b15bc75c4343efded634ca85037ca72faa2fbe68e0b3
18318b627fb4547f1ef59d181a4261a5a2dc5b137f8c5843c216475abb815e21
333921b6cac356e7998fe835bb81a70129b251a22e9d4cb13988213921382f89
9bcca7ab9393660598a4d803f782213339214b8dccbe33359c938906ad9737df
bed3773a86e5c7e09b213334219f11432c9bd437caad9104c9195c2388ad59e6
c17c281fb144d3dc604698532cc9f3395cda7a1ea98efb213921693cd358b261
95f27f5641ed9d5b44d229cbd01b213131215fbcf7d01f07b25912c7495ac429
76557663c77d2da6ad411021313630213f21313221213021298c21313121c49e
94f4df3456242bfbecf639f09da8f3616dff2ae2de6739f0fa8549484d624cc1
d9dc0e213339215fffb4
Encrypted(3C59E12631E918330DC96DE8C092C075ABAB4726)
444f98194a8c5c7c68d65f3fa43baec0f2044bcff4a547db0e4fca2131302166a8
838d3d259db7d97d3aaa66f032ab340241c7f1562449e916a58c67a8e9af1e67
5d8961dbf443248e21313121d29207d35d83f0ed8cc33b8c33442c54ec603706
21333321f06f42b058f3f3ab9c139fe8aaf0bdbda4e3c04a9895d4b120ab50ae
792d2656ea6b8f198f40213131212131332121333921df2131302142f36130ee
a46985f129fba6cdb74584dcef76c15dc321313630215b8b02e01a1994151e11
0446b58045838fa38efacda3636d7deac89ff85d56412d46bf6364f3c53685f6
781e8654366b688fe7b7805c787ba7acd5f0d4213334215b9ec3abd82a81dda8
21313121931101da9db672c6adf49a0f70550843cf744907ef17daa76b6de1cc
213136302146a6d2231d2fa143d721313121e42fd8ac91981a428623022e90e1
80f9f923fe56aa402570be5e0efdbd648a9d49ae4188cfbbdd6a6e5aa485c0cc
7efa2aa4cc56ca6273cda71481d88b13fc74ca918c424c8092dc8c5751cbe42c
46bd5c9203652f0819bfbcf617a9e21da62562580ee82130218039472139218a
213921036066c58c3fca636f48e74f4fbbb886c5ad17937f890539a6e1d107f2
ee262f9f65fdaecd4e9fca4defc772832133342175d41e1ca446af4e2deabf56
e81a54b2a69959fc4ea421313630216f808db4b3e89a7d1eac7b3c887b822131
36302178d9fdf45d620512f136036be666af93ef6a9467be6cd5e42fc11dd7e1
a538368a3ada3ab7ce4905c3cab26357011f5ec32cc578de4ad5ec213133218e
67f294352e70ca50355e816e7705b5d1d77d124d12ef21313121c921313021d1
75d2ad96e81466b4ed3aaf101185e35465c17919ae48c87dedfe462de9213333
215f31a3981a8781455e10c31f443721333921a44774b0b3815281fab8b1ea94
f83d9444292aed1496d44e3c6cf521313221ef11572d6114120feb365c66023a
2f1a34c49d2e28e9a5b867673fa9a53f89b22ee7f0d479d6213921585aff1a75
8dd1c0564d7ae8b5572130211c795eec69213021ea665cae35af3cfaf4a29004
43df68d5936dc1df98dd1292f88a735c8c45e82529b9f44c634bcb3da124393b
56bc684aa1355275387e911ef59c91ff961287c3f1a52133332197cf7dc571ed
01ac0f827d82c03d3a8766ac3a9bcc1ad32133342106bfbc8ad658d47ac6991a
cff886dfa3be21333321e5bbd6f87ef1b0e5f04b21313121255e955dce962133
3921af07118cd9b54ffba87d9cd48e4ed7e3d68beb3da459e91c29d0806a4576
1e322cfbfc21333421b625213921d6f72a799efbe4fa8b7cba8efb4621313221
69206adf9993c694a6df213339216eb33cb62133342144a35fbb6dc1ce1f02fc
678d01906908193cd715b04ae1213334216eee68d76b7fd292213021a3979bb9
9a7287434a9c5e4aba7bd833d2208cc3b69a4df19d2c67dbef4185a86ceef5ab
a73ded8e02dac52cae8382f9012e691a9746c94e866ad040903f648a45c2894b
a60504183046537f992139215985ae7179b3a7213132214ba2d1ae7e087440f6
f5558a72cfaecb043a8a21333921511eb379c8a63de1be5edb87c31d9b5315f7
fe0715e335e1c1c6caa915a255c94bdbd558378b69d95742245e50d9694474ec
e5df782872aaf7f3abdecf6fcc58f9bcae797ee1594b1733fd918d6921333421
45666c04cf2bd745363c292131332153ebac1515889dec6ed8853d499efd4916
cd4bef7a21313321e681b1a556abde2131302169204183205173811761bf2979
b317431978d503aadb0280f354fd745f54fa7d4624eadc8b968581afe62c489c
5c340621333421c83bec5e56854f92f78321313121ae61ae3b161775753bac5c
bd6687356cc1e8254d38f78d125ad1c6da93afe49c9fc2f1673497f4e38ba15d
f413420fa143213333217c4742c2c0a2cf40f910868d5d1286d8213136302136
46b918d4fb2988e4213130217d292cd14dee9721313221bbcc8eecc770213133
217021333321592bdc23d274141de536a421313121f7954083c421313021b1a3
73deada3362b14c383c2cba42e4a03842130213db7408f894d84f0f221333421
8033838d0521333921a7b829ebe01ca9a210ed803e41c82133342189f4df4d19
9b326f19fe79d0767c668036bf21333321a46e1d743268456e469e556c7a99c5
1d5ed1f7f3f72130214252489e572131302118d33a1b1429d7e2ffe220a6454d
6201383121392191e3c0268edfcacca388fa49fa12d808c0074d352133342123
74e2b64e4b964821313021c2e5f8213333215b614c884fab2bae49eede3be899
9e202521333421ce6daa7ab269d8f6e48191b791eb2131363021b4ce34405124
becd881040c636de6da77dcc2defbe47e42131363021031e458b4ecda356f6fd
95462ebd16240876523befeece213339217298254a21313121d42ef29fe090f4
1cefc581c321333921732e90f517f26f452131363021ec5a78d95bce66de4a6c
21392196fd35dfc05c36d9d3112133332161cffd0486ac2130210f19bbc1abd4
a7c9ceb411c7aa7bd3a66fc07a36bce830aa51a599cec8eb6dbcfd492b583d62
2c93984e7c1e1e152ebe44cb2a7751caec96661f08abb40ed539563f1b9c2053
dee3da3fea51f90e307117eb40cd71e520361712ae2139213d8c342ad0b21e1b
0736de5f21313321abd8898336146423374468ea84858b9921333421f9dd6468
2ecc2f8970e45ec0aa47da6eaabf6495d8ddb844944539f96185b4db69d4fce3
7078132131363021d81ffefea4d5213130210e121268f068e85b9f85b33501cc
31786021313021469370b55917fd4941633452fb23206821313221d1393a3a8c
dd68a303ba232ec3ac5834aaf31d8685c6f2e021333921816dcfbf8e3701cd31
57b3f50e66ca21302104241f1799e0810672203db6643b2668ffe42131332177
e6f6f89da872d689eed1c6f48ae37b418355ca4c5d86634bf7d7da0421313121
96e8f8198242e6711b855d86ea8ab183cf108704389891213339212131363021
e6d58bce3b213333215a73986040d1fdffdfaf235d17206436825ce29f578dee
a8e19d315aec213333218c783e98f0f166658dc69bafcb4e6a25ef3064172130
219363102ecb2139212d08cf9d48213334217313ad21333421ed36a934e5e881
febb2b6becd4bc3fd6a741367b0306f56554e9c2e4536ea13c71213334217e3d
213921fe5344213131216413a4a112f79cfa2bfcf9d8133055cc14f70e6343d0
3fbdcd9cdf62c0a4be213132211ba43bb1f12480d0f8d72c5143ef02bd735821
333921bdb0ffe82133332115b0e7b407e167b15a7a0812e696a28a769107d11e
bf0307e7a8948a88ec5e53119d8bb6416bf3a17f6b2a5a4e5b5b07733e357b38
59ccfe213021a14486988579377964086dfc181ae2491f7346537e1ca9a9733d
cda2a329eb417a906b85d32c213021d411c3be71df96dbcc4ffe398f75f7cd55
59deb9b0e2a8cb08a86cc8317a28f83cd4845058a78796bd786da576d865bea4
21313321e341cd30dda4dfac99c7448981fde7a7e2cbec32d0e6decf3d33aec3
29fa549ea62133392118bc08356069a11703f0fea4f0f5eb388e3c9f65297232
7e1f53118a81b02e2ed4fe2fd093d7f6eb9083e4f7e471d634bb519db86a08f4
7aa42dd095aa58fcbfa537213333212fb932d1f5d17cb760b6cf3d149d8a7b60
be18b4ec2d21313630214f1153694f411e0480be757ed87608fab35b47abc733
e5861f213339215f8f9853016b83e23d117b13034d101d87eb597b0576a2f9e7
5043accb23d86c63c5bdc730c9b09814ce66234da189851bbec9926bdc1c01b7
a9a65583718867295031ea1debd88d1655ba9c1e1bae57efa1b5a84bef213333
2177e1b9168798ea387342336846b62d21333321213131215c46070f21313221
6dcfe661c3bb40b8da593ae31e2db782eb4124ae54903b174bc603f3e2fdef21
3130218d7c781181f72131363021107ddc8247381dcbcbde2e19b260efcc6183
bde879b403ad14517006edb703c286b95e4cfc18e97e4b7b3685e0b2dfae3d6f
f06a474572da2bd408ed464e7a867c4277f221313121e636c774421faaa9d97c
ac6b4ac321392141be94c96a88b0ee0521333421213021611f24d9a101c5321b
4824f425bf7135a45e55d7213333212036c98e6edf6650e8bc6ac882c1d45d4d
21313121e3ffecb981a4be384ed862371d19177928c88afd4a77246dc39456e5
e0bf6abde621333921c886f353ca5f94ce385ccb213130218d6a213339212131
3221bf31b89921333921725972f7d56033eab63062209748941c2ded399fd853
64114bbf0f6e8678d8d53cd16f64bc7684cb21333321c7880287fe567bcff552
2696f544abf630317d9d6d34f62133342123fed861d2c26d92afff38ec5dd72e
b478f102aa7c28b813ee37d0d29fb8f4ae301b9eeeae132fa7718acb1404dde7
03b2999c15a53e187d44cab07ee3749213f2778f299e9608ed315f366247ff70
ddfeddc1ac7df01ca73fcbe78ccaab087c8d8176a103c41366357865d9909c4d
e5f5e3caff7d896c760844a825fedf9f6579a7cb1b7d6fd3eb163a4278213133
21ded6d34485ec36a83e6c03785a764bf5c4a2b804104521313121b9ebaf2131
3021a621392184e28a9d56cf7afd213339211032946421333921f1191cd246cb
68e812cb16b7d48d07165df8469134b0a63ec28318d6a785b1ee9f5d2e3266bd
71e17a1a0621313221926279282855dd8d21333921c878a27d21302142d23bbc
9124c5be3111e029c9631fef4670e08e21333421b4cda150b3b012fd23be7cd4
480e33bd929224522a9a585206eaf6ec3924e4b1969dda6072ca6a44ff17d1aa
fa5ef1437d798c31892444b3fd213921904d3634f848afb4f2b405986504cdb1
2133342165f286a201bd62c603cbfa7f6706069080d67238fe8f29e3e4723af3
dc6b5a21313121213136302138a33f9f7a3268cc591c76049ffae7f221313121
0125d8213021c55119ebb237bbef8a067cb88e614cd4eb213921056c8bdeb18b
c87a213339214856a4c76a5f0ee17516fb089e0e1eae5323964ec02418c741e1
87eb1a7dc76cf749ede55ae7a8a13bc83378dcc826b246ee811b3bb6c6b97854
972097bc87799b9d8188a4ad95023af596398c98de866389e1d269474b1ba719
1e634921313321b8a83d55da6d512131302171fbe189ee2cdc0565d8a27b2860
888853372131363021bea5d38823a6d96fffc732c73e34b04e4a6ba8f2fb0f4e
01acf185e8bd21333321416145ac7f69e7743eb7de412d40213132214e72777a
14477db07fe3c906d4dc7d768a6505b46496dcb908181a98378278ad28d00103
edd9d819559a5c77465c6893565a7ff821302164292130219abef7a762ba16d8
47364df4ea0144f67e17d021392108456d26ce2588de32f623b00e7e43dffb07
6ce144f6737db99cc236152593cf9088f1bdfce596abf0afe194213921f07847
eff63863418cfb71abc39ef03a7a152f6568ee2315a1f9cecf6e2ff10187cd7d
708326ea0611462d7949ba14ecd12b21313321b28e6876a9bfd215d394440132
284a55479a9f389856fa213339218bc4d2df036cf1448bf045c39866f85c1177
f7ce139736d3c12139216fe5bff9e16388213333214ef975df4c818dcb3cc7e0
eb55c1b6ba6ccc5c304f1a0e6a2f9c7e65268b056ca513ea02af3d2cc934fe93
ed0895dec42e213334215b5b87ca809fef16541657c85e957b0e0fd7a502dc7b
14bec7bea2ef4b44e93b7a4ec64021392149ff8973528ad110dbb7341b74abe3
edf65771bec5f650ef517b0538031caef793d6d4faaec9336084617af3f99d21
313021c446d484c9832ef394f8a12130212131322148e582f293f521313021ed
efcfe0ec84541987b27852eff98f614f15b0d41df251a68341825b2131322171
10d404daf76fb805ad8211a74be9eb749ea6402968025dc6fc4fedfdaa684302
36e53cdd1508bc3e15fa1617d19f80befee41b425cabb89137f534554861641d
20418e621d790e2133392174d529f073bdbe699f3420776f2dccd7bbb93882d5
450602b54404fa35186b67f9a4a220cd7e8e8269cdf5281244d84dbe83d5c30f
ec3b81a2262d29ec7f83a315b1213921a99468b87fb03040f48f2131363021fe
f58ff1a54bf0b5213136302141c77efdbad1753a5d47262be27e76c976cb24fc
a9fc13bd4e8b9bd2c43933c2bfcf2ae901913240ced45de842582b2133342188
bfd337eb38d75f0e8575213921a5cfcee76d0e41f6d5c66e8aac9886324cea42
cf7915566b103b86a731bf1aec69caf7e644d45af92c7a4f637b21313121a3be
73af05523fd942cdd5ea6ea62a0f0eba2130216dc7c27512f104a172bbd7fd08
9b75a1ab439fd4213136302126405482e543cbf59499c2cce125158c21333321
b2e55e578821333921
Encrypted(349D353509B4854BECCD1FAEB7E278046DBD4970)
f223bf3d9403b92f98d1e4b1641cafada7c901535b04c0ce464568c4ca01c56b95
af30c425ce7fd46fdeee744d6bf25b423249c82f057fa444ddb2812d98a33959
3749834cfa4bd16ba56da8f0f9e4bd857555e8ef0ff39466697921313221262b
10b87671625b644f47ab0f9e3e6baa9cb921313630210e95ce57ca45aa506221
313321907b3689736ed8b17dbec94742a47a94066aab40b5d8ba63703b71dd21
31363021c1efa1c99d7cdeb4ce43f049f4e635cedaa51c31e04c1b07a864ca3a
a414cb4e25dda41958aec2cb6252d13e1725a686c5cc213131217b99a4715269
8ca924603cc0f36e7011ed78104877e054bd2fd03bc503b6c22ae02a8398c612
0fca8a6daa2e6b2f48ada7bd343c98493ae301dca95c8ae504fb13b0ef574872
21313221a11f6879365ca3da4e7c4fd31c0583cbd0ade349c7fa66808347b24a
dfda4760ecb6d521313221ba3c4fc81c213339212a5ffe82c150b6f5fbb75521
313121313705bcedc0609837be2b34b22f4f21302168d6859521313321b6d69f
af629e14952ea9dd9b4d7fc08a60faf29c3cdb913103e0213131217bee03253d
5959258926ad967917794bb2f9b7213333218886e84d66daef69c19e5467a3fe
7ebaad2e5cdc594d11a33772f14fe318422131332143aea71b69403f26acd262
5c3357bebdb4c778c44d0757265c490f7f179b724d21313221d7213339214f7c
40d64da5f735a5d68131cdfbc1676db53ab0035b
Encrypted(6441F14CBD2FA4CC1675795582FF8F556FDD5F70)
a1963ac8aa05fa3c65bc3252a4302139219b90e4c27f621529349f172cac1a3713
e9170821333421a8a7f479fa7850c0d72ea8d59dbcde30c0db18f393b2dfc625
582cd74314320f94e7fa5804e0fc0e641a75d349f9c7f27d31fe61380ef78ae0
c3d8fbf88b5da37877e468f3c04736bc5d911fbbc96f9da96f2131322181a718
1ed396e79d5b795b396eadc9c8f74de31aedae6524178c60831832966ad002ec
e95b6a1a8513bc0fa4f9311072bf213131213a0e348415d606b35b4c72643463
f6cb7ebde33923bd4416eeffc5213921e9b70e9d8c7574b79cf3e0cd2cf047ee
16975ff4ee9c6def623b41fa3f32969d213921e0311f489a7b04af04f32d0789
e1eca766b4f9058b5258c442fd04b34e952bf44811446cd7b2a550f1c2cf2131
32212bd3bff64c7549dc6cbfe8632130215546313b0589ecdffd50600e12f725
ab2d162b2139217681caab071dcbaf0ff3213334214d7c46e3335ba38941ab26
149a1a2bf7d097e82133332178eb3323af95ad20c59def435f8994c69e40cf04
21333921ee661f474491076c5bd368f22c297530be5603191e357c2131363021
0466ab7121313321de9c26515e41d1524715f1588cb7710f213021ceb9213131
217654cddc6770c1a86cbcae9930a589f6f013f4bd21333321255cc79b30c830
d8d450eea4fee61c5f85eb411fbebfbb21313121d050313fc121313121cbd14f
18402039d020e0768b5d07d4f1a7b0a38141b991fc25f911a901dee532c8c8a2
5afc1c81d3eb3ddebf2130214f5afcc48bb54dbe97b2aa721b812978fdfb9c37
3863d74bd44231053efec6213021a1f8c27821333321d7d8c6f3424521333421
e3b4a5994da8c2ace8b9b9d3f1aea62691751a816fdb7b7432213132213bfb0e
c9d3159eb6cb6e4f80cf6531f155213132218ab8372131332170074a495e90ba
b9adde8b483686643f546821313630215f08b64ccc2d71ecfd10c23751945e6e
c759af0ee079cc213334214cce15f888f14a734c52ccb633c8ed350f3bfea7aa
f105ac5aa21f2878ab9fbef1308e7142e7bc21313021339da99e1e6beaabb0ee
4af82320
//''Note:'' This technique only addresses the problem of comparing two elements in a list under sublist insertion. To use it for finding subelements of a given type, refer to [[this method|Balanced Typed Trees]] and substitute the ideas listed here for the step of comparing two elements in the list.//
Idea behind this is to redirect the work of inserting large sublists to the //Lookup// phase. An implicit //insertion tree// is defined by when / where the sublists are inserted. A sublist is viewed as a single element being inserted into the list we're inserting into (which lets us use constant time single element insertions).
A comparison consists of finding the LCA of the two elements in this //insertion tree// structure, and then comparing the order of the children that contains each of the elements (done in constant time).
Issues:
* We need to be able to answer LCA* - In other words, we must be able to answer the least common ancestor query with the information of which two children correspond to the ancestors of the two elements in question. Just knowing the LCA isn't enough.
* Whatever data structure is used to maintain the //insertion tree// for LCA* queries, it needs to be able to handle entire subtree insertions (and ideally deletions as well).
* We can obtain different tradeoffs if we consider only //hiding// subtrees (respectively unhiding later in the series of operations). Deleting proves difficult.
LCA(*) Papers:
* [[Tsakalidis ('87)|http://www.springerlink.com/content/h8931352348u2k0q/]]
* [[Alstrup and Thorup ('06)|http://www.springerlink.com/content/f122623116003l47/]]
* [[Gabow ('90)|http://portal.acm.org/citation.cfm?id=320176.320229]]
Encrypted(E1D907909177F92B62895B5376860225EA9BF2D7)
8ed31fbe4cd797ee4b682f52ade8a88961e3feb11fcd16d4974b5869d11347c48c
3f2d5944efd42c21333921796e6b4ed45c925cc57f201492b0155d32ea909d15
6354b9c65621313221cef7db5ddaa79a9d21313021350319012fe5dfb34a8921
3339217914dfe3974202c4b7ca7ff6477f1b2392b8437932519a31eee35cda75
b32f213334219df4513b59fe3910f7d401173cfa74c6e45d3c24a8bdd6aab8be
1153899d61295b213136302120a9822b59f43fac213921348750b0784361879b
0385a7847b1db38c9214070e614cac4688eae794974fa3fcee7535c68e3e7121
31312169efcab0607d8ec2c3f44b95e1213136302181c85959ffabfee1d93edb
61f57ddccfa2922d1baf886e2133342112cac57a537d61597d4620d4a63eef8b
386d1ffd43358adea120adda3ea3502bc3ddd5a44e24e135f0d5cdc2ca86e632
841611a4b79ad69d897a294e533eff7efbbc38a150b099e05acf44ee54876d49
2501d104ad876c588afe9534746b213131216a6f059a2adfbd85d2a6c2296234
99c4d9172a68638b3c8e95f5e64bea9c213132213a255de1b751eb7c64428721
3921d040c8e057ed3e4f105a21313321c431d64ad8213136302146cfa8c889c1
3c32b4574e79a45beff6a1daf1ab032131363021e7c123608023151c40a72131
322158af881190acde56735e82acbc3c
Encrypted(1BDAD4B5A5E05B7F75C8D66D2B7B47007FBCC56D)
e439b55c86c44df1ae5be8213334216a9e3a773e01b5bf3383e8d0268bc710e3e0
f23dbc06fb60164ced502e691ce82f308f744aaef4f7f1e374f74a3d592c24eb
2d870653612cb4e84d14bee1ff81b2d9ee50d369213334213092a9c216d2c5cb
213131215d26927138be21313021cf94872f6644135ab51911ff087442a92130
21d3f4e72131312148ab775580470ff788d910911e1528314d4f3d5e986c1dc0
4f939ceecf2be2e5b0842139214caf2ae685c244d538d5e8be1fd905a7c7ef21
392154aa845ee3a1d5f4e98c1ef22131312190814c422ef09b5aa87471b6c9fc
2643ed6dca9f55ad82a3b275d239dafe90bdd16c1ec41a86af603921313021f2
663108ac6bc0c621333421642bf09be52ca180f468d7bed28ca8288be01d4ac8
aa5a1ec21730e2bb58f67a519e9b18e965e5f2f9042d06b3997ade44e70633ba
46b77628aa269bbb62237e50b6b32133392121313221e2d1816e2130211c44c5
a1514d104605bc9d99e3328c91ecdc86f7f7b3bd47fbb92b114bc1f041209af3
ae7bb1ca9775674539baf48626199c5954213339214179a7
Encrypted(019C60369054BDBAB33FFF420CAADAD56A63F11A)
4c7d313bc5c3cdc2b517f21ae810c8213339217716b4f51eb1e39a354b49ebce03
dce6d06d6c1743f9f895b721313321b8c04fb60768361df7344a71988a517b28
3b4483deb4669efdd3906e9d5ad22a8c6d57fce7d532306e98296f45653a7cb0
2cfeec49af07ee1beb2139217ba49dc8080ff0bacf21313221fcdb59df3d47da
d26f47d2fc8391c771ed213136302197c525438604f0e5d2f0a63a37fa554050
7824c75f56564cee34ceae3adce5ee48cf9075f06854f6effaed618306ae6788
3fba581e356056031bb60fc6a821333421e62adf16cfe19d2cd017ebd2911c8c
b757991aee11e16bdfe0eb48d5fe2cb1d9cb86c4bb1c6866dfa8a1bbe3515701
1f36465f59befa99422130211dc073f255653e94d7fabc92d3c967cb70800518
a8aaad3f9883852bb1f621313221e2696861bec3e6c5e336213339214fdfde70
9eb754e944f159b84c2c57712d3790fba672dffaa6ae2130215104fefd718739
f883f507c656764de4929221333921306ff20fc6be871a3acccf06609130
Encrypted(EE92F2A032053E5E076D2F66E85BA96BE8D0F188)
a4c27106e0e6db1ade762131302176d43f6f055aa8cb594a70ae8dfb4851cef430
293d70e1c120b6561da8cfbe88f5f71cc5970514b93621333921598896874fca
b96a21313021644afc7715d54b4087df1897c1bd0e8914c6bbcc07d58cfce9b6
61c748510fe12ad1cb05167bf21ebb812b5269a7b0f144c448033e4101ad4923
a1554e879a3d21333921f6d1ed8092ea45721e26592535fb34edf36a1d77cd7c
b175e94652f892a224234345163d8f4221333321e7f793dc778f9b4a21313021
b487fd6d213921ecefc4bbae321579b5648e909f4c1adaeb1a7b85de6ed8f2f0
9aecad522d01c14f1492dc7d205f61acfe548c7d213021868dba63ad93c67b6e
bc9aac58ab8054de3198845bad32bcbe1ae121313021c7c0b08c7dcaa364ecaa
92682cf97a5331fc3cd7ca5a35cc8b7c1f92f15f31422f451079cbc24a4fc887
d87bad03628cf94a37b0493ec1cf1718187c855e55bb9f7121313630218a61a8
476fb8e81fa35e829a2c21313321f24121313021450132c3fdc49bf149f99ef1
5b2133342101cd7f41235498986ec14d152d8e758c21333921ceb2a9d1c195a3
b88ae01721313221e9ebba3011bebfa2bf28da21313021a80152f0e7d1c3d05c
655c7578d09101213921f263102cccdb8991b261d0e7aea99285d617074d6be3
079fae418ea9e9e9b8ba39b2502133342194131cec71d576ae4d0e560fbe38d6
21313021dd7cea2ff34f8ceca3fa5f577b39cf9cb90e2a301a9e859844cd45b9
f914db9395d9cb8897fe261a9f6f
Encrypted(E72C95771BABAAC3EC8F4549962B4983B764405F)
08855c327ddc1c8c604c81bbe39a68bf98ce01213133216bcadd2569655f213334
21d3838f3145ed79c7b1466b6c71b7033d4b18fba14d8aab9f4bf43ed6c9303d
4703213333214063b5e5b54197213334217d7a6b7ce70717605265f82543ab39
c34e4b5ebe712f4498299ce3252bde66afd60f949b2341fbf3e39850484f82ed
b94eaaeab2cc42e1f6131ad7d6fed1204b05213021e44bb9aa0730139e0e2a21
3333219f0659b0287a5092c92acf34b08898a95080e86fcf4071151b68ff2c21
313221fa51963cd85c2a052e76f8945bb9b7bf7d88b3606d03ac1ed0f3e22131
332153be5d0f2a04205bc37a8ae04a4421333321bc2b4a2ece2cac48ea15dcd6
df1f163b7c4582250558b3b6616078d5f537213333215877213131219cf3f4d5
a9213136302139fb2bc78edf9d9e94baddcaf9a1c56d7f7dc5f425f28990c554
712854dc1821313121eb9ef275230f978c94b7540fee180ec4200f37e1c11ee3
9ba49052238b88eed95caa40e1f42eedc2a5f321333921cd635b2131363021a2
a9c6a81a80e67680ba2d15ada98cba7263ad1eec93aebf105e292b47399f2131
3221c90eb09af2b6463364a4d1ead981fa5792ecc03f55da66ac425254d74614
b4590ed9ed077ab6bfe869a7ea826abb30bbbe7257cbeda6792c2b309d552133
3421f225632130219de590bfa1cb372a662399367cb8a29ed44f21313221c2a6
21313321a610446dc84994234ca25dd39cc3ea6e8e3d7ac507e6c12139215215
959a2880b17b88c7b21a3f100f3a8b25404e9f2b47beba59ea2f2a7481fc976f
a945dbfa21313321ad01967da90531bdc8d09a8dd2c23ea39b1ce48b3986c99e
68573ee404aad739ee213333215c4db5fce6486f531a506d014dbbc0c8c65010
10879721313221743f74e1503f02df0f73de75db91a74123d9499fac536319e9
fd2131312140cf6cae8f04e94b66bcb7f9fade399d572d23927ca4758c809c56
02122921313121f9fcad7163417edd148635babbeeffedb5d39a84da25520fb0
d6ec69379391351ad7ec15213333215e28bb84a25d11cdb159dcc9afbd6762e6
af12f84857e3a52c3cac213132214835b10f915d8f8b7d9c19401c9c8dc6604f
c7b2f9699eb4370e9df0268c7e557dd1ad86bf7d9f1821313221c1c2a8a9391e
13971761593cb404801021313021b5f21cf243eb52e573b57725baa421313221
58703eb24650b948d7a10e38b9cfead3af944d96ec4d8f55038d15da507ff595
3510d7fe21333321f2d773e39eec3f5d044755027df7db538a5cab75213021f3
29acc9b87e51d378579138f2f37bb57ca78f3d16234705ed50d323e94df19b78
2133332192dec85d42ac2a5904fae84d3662a36346d517a6f7d7aacea4cae971
7b0608c1abe401e4bfc6acbcb26b213130211f949f4cf0c9186df595974f18c2
a9f33db12fd9e1c6179072724d960128a4ba4d99f62659d590261fb030213130
21ea5c7b2f6174f9c83e1fe1d397e9fc0121333321ca123c3674785140318628
97d535862426e90fb169592f57c4411713b41653f33e40dadffb708d35e2b1b3
0e9a4dabadc64f995f5cae757f846a1ec581ce9e8f657c83bed4be1d15c4d53f
2b776b1d56590f40aa72c1aa6178577d9d1494b52bf3a2667405484788b4f9ce
a7e22f4878c513d51e0846af6c2ec298903d6938ac405aef7d44cb21313221c2
322a472131312186d0b9dc145e80df87bdab8035d8a7ef3d6183966694478e9d
72bbf9905170cbfe039eb0a1568eaa5b743caf62312131332138dbf0ea99903a
dee2c6bf63053aea2aa71c7e53453b1c7353d84270677b02b7d7141b2139217e
21333421bd807149c673b825293b2082b3a7edbb96f63e71cedf58172891a8a5
e892be6c24dac7cbf56baacfe1f1e121313321441d3d0310965db892a77b91bb
ff83365f3feae5d090206f4d10af01f7791dd2bfbcd46cac4d97a64ff7487306
29e9ec13178997ad157b477314dfb75ea26b3a38693a8f0f354a893fed4a472b
1a151ab70eab8721313121ad79973915e33c0f974753988dce78f41198143e21
3334211fd353cd581734c1d6b121313321b16e388990da56213132216574e34f
03f02f584462e0fd91d82820cbb9d48ef5d12a37c64863f29513fcf758f1cdc7
29cda57be2952a673eed564bfdc549861f213921acb23dd6c0da213339212131
3121918fe54226119d5eccb041acb48619b458843f9872bfe78c88d74130bf47
ca
Encrypted(F2B004D41DAA5BFD3D06F85D264A63C077B36402)
4b633b2d6ffa02716542e9bd7366fc6d3b25383dbf6b213130210eeb2cac7e88f9
6e2ba7fdf0b62393fc2386b4ed4b3e1e2b9d9d1d142a1ba9da21333321fca8ee
d2213339216d21313321cfe962443a43e321313121497466f766e7cc104f8f23
a3560e587a21313121c4cd54f15eb717fffb797f159b78d61c93675689dfe5ab
c9213136302117edd5fdfa58134695ddf21983ab0106aa9d295e282139216046
ce4e70e61a3e334d2680517b61f0664a792131302163e7b19cf536fc281a7da4
fe36e03bdb519c328a13d9e72c7f87abf55ffb2133392141e89294e9edf0da64
32a852c9da6435aa7b56c197213021bbc8fc9b3063602a16ab213921c65ec189
a7ea595271a6fc3d2defd75e865145788533df0874213021a6d0f9826f6956fb
64a2057acd4d133fbae7e673c49245ee8b55f87c0ed81dfbb5be7954689cc9b7
9039fd08f51a42aaf79378c323bedc74ab5b04bb497d9989829b2f634b235692
326395
[[DSHARP]]
---------
[[Visualizing Search Space]]
---------
[[Job Shop Schedule Partitioning]]
--------
[[Message Passing for Solving 3-SAT]]
---------
[[Maintaining Order in Linked Lists]]
---------
[[Backdoor Graphs]]
---------
[[Thesis Ideas]]
---------
[[Other Ideas]]
---------
[[Links]]
In general the problem was motivated by finding typed nodes in an arbitrary tree. Almost every approach comes down to the same problem: ''How do we efficiently maintain order in a linked list?''
For the insertion of single elements, this has been handled quite effectively:
* [[Original Dietz Paper | http://portal.acm.org/citation.cfm?id=802184]]
* [[Tsakalidis Paper for Ammortized $O(1)$ time | http://www.springerlink.com/content/q3337h7771w51677/]] (See section 4 for the bag trick)
* [[Modern Improvements by Bender et al. | http://www.springerlink.com/content/gm8mjdfhaa4c6fr2/]]
Problem with this is that we'd like to be able to insert //entire sublist insertions// rather than just single elements. We can assume that whatever data structure is used to maintain the entire list is also used to maintain order in the sublists we'll be inserting.
Some of the directions considered are:
//Note: not all specifically deal with sublist insertions//
* [[Naive Space Intensive Approach]] (Developed in summer '07)
* [[Skip List with Edge Information]] (Developed in summer '07)
* [[Balanced Typed Trees]] (Suggested by Prof. Ellen)
* [[Implicit Insertion Ancestor Relations]] (Developed in April '08)
Other ideas briefly touched on:
* Using the Tsakalidis $O(1)$ bag technique but merging bags on insertion.
* Splitting lists and re-ordering to keep the ancestor relations shallow (and balanced).
Encrypted(118AFFA45B4371F851BA6341D8DB3EA71968BC05)
03e645f1f776a2fe7136384935c8ebc6f7742131363021dbdf29c868f6f3c56242
5f156f36eb9cdf196477510eb777e59859d886e034b5023490142b152a5f762a
db2821313221cb6e551448d401cec49e489764495edc05773ad03e4d5d876384
73d549fb13a568bee3c871213334217405f5efe26792f52c702c57d8ce8d5d63
8d964abe06732131312116fda8a418fe8d5d48046d5783213921481b8e9973f6
ea9256196fa890b9649bc6afe42131322185869d7b7321313630218e6e07a976
96dd731d362130215288dcc74dde5e90c99f7e1b972d141f6b5e989facd7ea39
f3e66535a472d39957d6d110a19c1cdb2501bbb86cf221313321c581d6a555cf
ea6723603f2515646e1a32ae298df9e797025cf8eb598c3789cbb8d28ec53db1
6299a57a77861730472015f1ee5a041175a5cd543dc86b4a894ec2f007213021
fe4ff250e913c531df260323767c5a7e6cb2d221313021db737bf6d233349265
4c7faefce584e13b3bc342882d0433e84a6cf521333421f2113b9655e9fc7761
ef496845b0f4bde82f487fc7d83b6125d947fed67f2b21313021fb6c21313630
218b346ccd64412bf0f9e463be2131363021f1816fcac6a28fff40ba7f213921
b249cc75f588daf6019b4aa2d1383b4dff428f133bd494e77fdca879dd67cca2
a9a7c646995db11c21313021e79cdb3575ae669ef2550f1607ab3ac4dec14568
40438b11b0adbda430753708775770ed59d182d2213333210777416f2130219f
b50508171778c8a386075ed2bef73115624c25089edd465e085b63ea080120f8
6ca80f886512f30ff6e9e5d96aad2a40b7bb9d23b6b50e4c1d756b9e4492eca1
67033e2385363a7e0731b5d383dc0e61739e29e731c355bca771dbfdcaa64c1d
93a586089595feca68213133219588f963d4ff95ccf644f2a31a8a88ebf4cb5c
dd98c203a7e8a14525104da92133332141f2358c042e8bcd45802131363021dc
b38844207f
!!!Abstract:
>Backbone variables have the same assignment in all solutions to a given constraint satisfaction problem; more generally, bias represents the proportion of solutions that assign a variable a particular value. Intuitively such constructs would seem important to efficient search, but their study to date has assumed a mostly conceptual perspective, in terms of indicating problem hardness or motivating and interpreting heuristics. In this work, we first measure the ability of both existing and novel probabilistic message-passing techniques to directly estimate bias (and identify backbones) for the specific problem of Boolean Satisfiability (SAT). We confirm that methods like Belief Propagation and Survey Propagation–plus Expectation Maximization-based variants do produce good estimates with distinctive properties. We demonstrate the use of bias estimation within a modern SAT solver, and exhibit a correlation between accurate, stable, estimates and successful backtracking search. The same process also yields a family of search heuristics that can dramatically improve search efficiency for the hard random problems considered in this study.
----
{{indent{
[img[http://www.haz.ca/images/message-passing.png]]
}}}
----
Essentially message passing in [[3SAT|http://en.wikipedia.org/wiki/Boolean_satisfiability_problem]] boils down to variables and clauses informing one another what they are constrained to be (clauses can be satisfied or not, and variables can be ''True'' or ''False''). Once the messages converge to a stable setting, each variable has a bias associated with it which we take to mean //How likely am I to be set ''True''?//.
From these bias' we select the strongest variables and lock them to be what their desire was. This generates a new 3SAT problem after unit propagation, and the process is repeated. We have found some success when using this approach as a general variable/value ordering heuristic, and the following graph shows the speedup obtained when this is embedded in a popular 3SAT solver, [[MiniSat|http://minisat.se/]]
----
{{indent{
[img[http://www.cs.toronto.edu/~eihsu/VARSAT/2vary-n.jpg]]
}}}
----
|!Links|
|* [[Derivation Paper|http://www.cs.toronto.edu/~eihsu/papers/hsu-tr580.pdf]] |
|* [[Embedded Solver Paper|http://www.cs.toronto.edu/~eihsu/papers/hsu-tr577.pdf]] |
|* [[Online Results|http://www.cs.toronto.edu/~cjmuise/final-results/]] |
----
Encrypted(7AEC52759A78B38923984A4CBB8A0230389B9D7C)
81b50230eb02b6619d447f2133392157f34ffc13c4bd6177e3e7bbd43fc766e721
31322147f20375d41acbffa711d0213132213f213133212131332160d6bdbc1a
45c4c96889a38f18707821313630212c63bf5b417ebad31a351a131ce923c316
1ef275581cf35a95706ed77ea4ccde1aab53d932ceb3e3fe55d6fe396e213131
21a1e6994664b1a6b375746ee468846d4c3ed0b42a2515ce5a57af049b150435
1c7b4b36b92646c88f2133332168e4b42fd66c3de3d4133a65472131332165d3
620e9ae8853c771b47f397ee87341d97c723b2c9133be35df55ff6556073e76c
1d4e21313121c94912ddc99701eeffc0544d60ae327361c9080673e1e81f3c43
b4e159e3bc12a25060aa7fe38615f5c4867e579a355214e9ffaca1ee31213339
217e213339213ffe3d084252b81e7fad47e3417fa66d52b5d750d63d908e2139
21b82131322145b7ff242cb647edc8515e26676821313321556c71264796d915
532bb1dfcb4e5eb08e68b7e5c305585b05c2cf3e1d79d7c358e637584e7e4ae2
1f9f440899a3d9d5c5b68f8031f8213132216f8754fa0103b0d947feae213339
211eb1833c31bea91e7b17e587e62131363021415881b98ed858d2142a213021
213339213ef83411bfb7b521313630213d157a53fccab72a9174356169d207db
28e0d1738811755d185ad1e9defa99d611aa3203499765cc3ceeb5497574c88e
a9e1f4851596c8ed2a28b14039ec7d337fe6e3e03da7679a86f76dfa7fce9006
b3d7e2864bef5d2e9937683ae916feb52bca052a4efbc35e75e9882131363021
11b9b05282994f6b0893925035b4ae983e6221313321eb9b213136302167c1ca
b58078a1763cf08dba4b9b1ddeb66eba2fb18c355f4d2e1e5e34fa187a049b43
1f21333421418162f42c8552f61b4e03d5448094328e21313221da0e9be1b206
43c2359fa8e9e29570489b1d628010b082213021e9243cde746f8c4a997c8dd2
e01b5520747015b602d6af642de44b66187e3c2eb404d5cf4e6a393be82ee43c
538aa154a94819fa52aaf3c63a1907c42133332133812bd4c59c7151be8d5b4a
d87704e69e213130219acc446db221313321fedd5041dad8213133214380ac3c
ef7360ddc45299bf2928b20e82213130211e4fb27c7685606475a834c2213333
213a6a87853b6c541e14e3aac3334cc561b5d7cd559e4667d026742131363021
4c9b60414fd6d0701249c9e68a831af2c775f1f59e7ffe30e9213131213bd486
12acf0c43c848c5ec0ff47d29cc21dce7c30a2534b45de80115a490ff65302af
4c2c6e06183248c3de51be5c2d243b49cad9dc36df754c93cd9c405997952131
3021bc62e0d46fa2bf1344e107b1991383e92ac8341cdb3360da3d7cfdfa40a3
4e67233e604fc2a6505dd1abcc57335040c90356684921313121cc2131363021
41f957d021313221497b1ccd2f6eab055645d08e07dc73149c19f6213021f9cb
bd21313221fdd560d8515785691285a5c421333321fe4eec864745fbd2b3b13a
e26ce0b5df21302148a3c991ea8fef32138421333921cc949bd085e536213333
2133f519a28c4fdf29db213132217573e6a220ac62ef4786df92b73974f212b1
ab398e60454901048bab7e49d26815338aa199157421313630219751a75f6b21
313221e0bc6272f8781d53a8b89d81538315dd6307213130215eb4dd78037c44
ca213921f965213136302117fc52fd53f7922c6ba33813dc7e2130215f652131
31216fa991b02e0f72a16e24d397412dc2383b47ffa758972b1966ab63459f87
bda6e8da16dca6e89c32b3945b213921825b9a5b07ab6c68a70e7efc83df9fe5
4b68ee2e6b21333321b12ae5248c4543213334214ad35180c8d924583df7dcc9
c924edf60629d73dd424e3fd938fde21333321dfbf55985644f9a359e5a155d6
1a9b85eaefb68a3c975534abf225078c9f327d4731765c34ccb608c6461cbd7d
6fc4b346ca2133392121313630217b3df499a69021313321b7ad3c2133332140
ebbfebe8b0b545a97d0621313021c2
Encrypted(217F08FC38BD3742E917CCE871E41E39A0EF30A8)
8f2583c54d4a14b8e3114e662d8e2e153d1566cdecd3705bf5e39ce33b971ed624
bcfac9992139213005a92ffca91f2fdb391e414561bb64f3b448e565fdc0ed29
a9ba13d9136280d6213334216bfd6f9641944e3098248afd490785396bdf6da9
0f66b07b642131312174e4a18912a4d9c584447931cd9199619d8ac7ec31c266
819f2ac78566252e3da70ff61f21333421660373c31cc2879c133f027c76de6b
dfabe2ac52fdb7faf9c1e594d17d3feb66f17fc08575c9d1621c3a2ba917e9ca
da83528cb670f61e9391c84132bc36d9c034aacf8375ffde0714f43eb1439764
ff75af610e427f10d2fe88e82086bcf8de7a1f15b348b91c8eac5bec41c1d5b3
a1b8eeefb125ca2139217f34ba48d8149c86937245d44f21333321a130b92133
34211b78d29350b1eb9881f8c7ec98b04299fd2139216a101478c1aa12bccdc2
6d076ddc7c2a298c4bd0f7b321392191919f4bb6558ff3988e78ff3f03b2e5e9
45132b5f706517e62564213921f0d95a2433847111213921a14feee35b58af21
3921e762afaaf3f77e2a3cfbe4f64198469405f926b714f641cff0167cb47353
8f33dfb373f4248de418f4ac3626a6fe4bc0e1708071b4696c2007be61f81a46
d5a9702e83d63b6ee6ab57ca55bae03f7cdeb1a36c21313221c4f496751df09e
4f469ba1f96410f8f24b8bff5737d461e317ce4d4f6f18c596f51dbb9c213339
213e625c1a537d55c1cb181112e438fdcddd85ae619865c78551306ae1bde885
d37abdc1189453453c5946370379433f5a9de95ebcca5dad5057a337d4259c83
639a5da998345d2e2131332126156310338699b9fba2e4cf35ef79548d317415
f5a80268d08bb4bafe213021dffc564d2f4a802a1003601b4742f913b0812d26
cfd421313630216d3aad05a5b2bf99d1b5c8925c45c29958e28c542377435a19
8f8eff3e54bd114096b4ed9d1cb5505dbfd1e307991b075e44c5e6ba0301ba2c
2ba2213334211702e7c78d7adaef11c1559a4a1c89f839ff36241a2a696b2133
3421c16bf4e3741d03a2472e9f4e8ecbfc75c581987161e8c55f7e941275313b
f78784acecafd6a5db103975d8f321313121bb4fd6c5ceae529bba64035c7e2d
c312c24c2c88a28d34f7333e836e0459cfde2070067bbd64df6791e8051142fb
1b6d98589114ab5654f6213133218b93b7f4c3232654c750d73869af7382faea
9eea056c48dad4ae4fdb2986c86cc0a27055213921f4c65a2ed2cc3a51956007
83d8d675fcf8de64eae03a26336a5e2dde5dea6331299c91f09e59754a2acef0
cef11872563a61a82e306e3ddd5066d0213333215163c921313321af9c38c923
7c050eb082fd29e54e26deb2790261a2ad1d26cb21313630212ac31ef4343b98
ddc08df0171b610899f259b3908b280e921f0f5e03e15829dc60436fa2185bcf
cf213136302179f02131332189c7b32f9da61ab0f84771ca71a604a225d865ec
ad49815d0317eb8d3ae608a632cb06846ee22f027e98d216ff69f94bee603d46
9f99eb1f41d1213021e9d319579df37ccc60f3b064f19c85c23de6356331643e
765cec1771df6c93448a299bda213133213b55e7cfb8faf6043c213334211cdd
112eb6038b3847fb6063f39cd37cb91b934056a96dbea6a848dc37fcf2530721
39211ac363a85874ba2e3f8629b1c8d03687647760bb21302104e394a9daff96
4cea5f463b83670e2a60d0a8e256ccf93ded9e51a68195f8cc9674ea4e699688
148b8cce5c08a82621313021b1d89eeab684fb1076701567e3a57721313021c5
fc2f21333321ed3c6f503e04f72fd7c7cd125d6c2b9736075dc5ff0faf85c932
3fe1d4cf4f687385eaffbd3531605189870e130eb6c3edc4f0562dae5703c7c0
76d9ec054f8790ab75eb35fdf1b7f7f71549b2a6c826176c3883c98978266273
1c5f8d17612133342125b656597b3803f073213334213b0f3021302166e81d84
a23a5a4ceb7101ecfccd08e2f503037c21392192bf23b5b6bccf42c421313221
d8655dc2ef3bd461b0fd5ad9
''__Direct Links:__''
This method maintains a few things:
* For each of the $k$ types, a linked list is maintained that corresponds to an ordered traversal of the entire tree.
* Each of the $n$ elements in the tree maintains $2k$ pointers for the start and end of the elements of each type that exist in the subtree rooted at the node.
''__Dummy Nodes:__''
While this idea didn't really lead to decent results, its implications and ties with set operations are interesting. Basic concept was to maintain the set of nodes that exist between two nodes of the same type.
''__Space and Time Complexity Results:__''
|>|>|>|>| !Element Pointers |
| ''Variation'' | ''Space'' | ''Lookup'' | ''Insert'' | ''Delete'' |
| //Direct Links// | $O(n\cdot k)$ | $O(1)$ | $O(k_s\cdot anc(v))$ | $O(k_s\cdot anc(v))$ |
| //Dummy Nodes// | $O(n\cdot k)$ | $O(n_s)$ | $O(n)$ | $O(n)$ |
Encrypted(5C8D1AF28E6A006FC59086581635179464A1AF56)
205ac67a4ead51a457f271ce32a191213136302194c950e87fb82e95eb47b7b47e
6e1bf8d94da25755d55176959ae8052006669a36aa0295e2e96c15e358f65f30
3e745f7b784d852898a88dac2139212139211d839b7f15f55be5574d397a2f56
ba47f4423054f82131332107e6ddf53ee93c5f84427ee11dc6af15475fc07b56
f720fe2a0317db82ca31a173807067da5711f4337e2dd91349492c3efc23b020
213021c0e0d4d7bf540571f0958b21313021555c1dfa99cdfcd64d19c392baad
4333f7b05aa3f42d4f8e4789672dc54cd2ccaaa99ed58fc38c21313121658c6d
e190823dce0148672975a2474d81bd21333321c3c3b2acbaae292978d8dea9c9
f3406dfae81037a4cdf8522efb6eaa3dd993c536558c9ff26347a7898afa67eb
2130213b21313221f6ae118316e7ad7d4275ad452c862dc1201f9ad61804dfe1
ce4a065c9369bc95f711593f6e0ededdac0ef1dade19f75dfdd647a2408926b5
4d345c1a17995742bfaa21313630213198fd3a0792fe43949b7219114ce12467
fc3df1a670f4cd133fda742dc85e3007f69f29a399a5333daffbd16f5d1ef178
57a27542b3a67cbbdbd81bd021392187c22bfa16aa5638dfb49c42b7f5314443
38f56314502cc323b50504812e5ba43a67a6bbf7a5dce27c5080427b621dc126
922131363021aef8c254aeb683026621333921f3a144484c7fa8d9f15d213339
21d771428f9fb49f01843bbf9db79e369219ffa4fba77969542fe71839dc90d2
08173a4a4d2b8a7db7a6df68fb76165f213921b9ab21313221c7d5839e213130
217a78518923e121313121508fd5d2057e46d48aa1eb282f89b32fd789abbb40
d6ce4e7d7a21313321e3803ffe1d12c623f60f8da17457932131332155982621
333421023119898f025b6dec3c85b7f39adbb871a62b458ecbc671105f7a5662
9f49c15c6f4d4a9ddf982cca88a1ee3d13b1f6e942e021333421f1e79ff35782
c2dc4d2f92f404286190b259af418272fad72b4cedf3d737b86eefc0fd4561ca
e05e903832d92afb2133332137bb9eb9fe2f15c955714d0569a4655b45b2f9a7
624225ce8ccbc193043f73ee10d746fd21333921b73313f97bcc3e3449816fed
7efad4525801a17bf5847e213021172aa879cc2d6620a78dfc44a901bbab77e7
08394b553a0308213339217f111dc03ed4649d8ee20f858b9f213339213ecf34
e2ade31cd09241b845ebfe7edb19abea566145073e121470aa9cbc95966eaea4
36e1658c8fd906af8be035df23fd99865ad6b1c9eafe7489f17cf353bb3e411d
b973ff2b519ed92f1708f631a1548593a7cfa9ee1eeb55c2e531f2dd11ee9265
2af9c46113fca3eeafd4da9ede8777bf6a796b597b5d99b79005177055b595b4
7c43d3b380a9971664d99429213130211bc04180df589a45a3d3c22d7a28e87f
b132a1f97f56b66df1c050fd313be7b31188fc385972c611772eab230f1101b0
725f1d2c7141367fcefe44cb3e721a50bc71703e424fd4066015461feffab5c0
cfbafcba5cd2d9d3f803139e32fc021a13bedd4f5fe8ae9321313221f5990f9f
a9015259d0b6e2ff5a8112ea639f6565b07a066d2139216faa5c7629d081de97
4c96a1758ec9372133342156b92b7afac8f95a8657ed02b407d84060a437c188
b271988953f3441cddcc3c36038a197da7e6883cb387e436e2634349c5b9b744
4aa528eb343462540fe321333421e7287b213130213a5ea6e4b0859748fad005
5b63264893e2eda783d23a64b27b8d3744fc21333921dae35dfd78eaab18148a
c83e11e3e063a18e34b77c3deb54da4ee44ba9f805477cb8b12130214a12488a
a515f430612b9328afedb1ed5ee3ca0e5fe4dbdfdd9655116b65b59ebdd42133
39214143231d21313121c5bc54c63b4a26f70298ba462e21333321f31b087aaa
21313321ece679b043ecd5dd8ee5693c61e09ccefbfb888bc045da85da213921
b46946491c4e8ebcfd2133392172127460e510cf743563c1213921aa7a9e537a
409aa85d16c4f22b6375b0a4b48228246b46fbd52e88dbacd28f25ac7ab0aff8
7ef8a4ad5d26b8d4e54feb213132212ad357890305bc7c49df943a79f8298e08
9aedd6752ec43824c02f485c21302132e4fca45923d4f02065a460bd8f3f7bb3
628cd5e15dfa378a5a18bc9fb2a813f3122c37be5b7d0195beadc757328d87e7
608d4a5e2056946fc849438a9270b18f1da728c0b060e02e2b2471831b93dfad
ec403488598a31d0a36e45c93321313121656e1673847e7ebabecdffe1f1974c
f0466b556a89a17f90537d3270fce042b499192be2c568e6c1cbe5618cf06926
51d48c73eef958aa6b592feb5c667fe415316aedf6d3d7b9be213921f5be4216
67e1ccb040fe4b56475055046371ed2bbeaee54c188068939af23040a6c49881
6c7d8b49c1432c82b49ad99a9c490e9e21313121cbc57eb029ff8a8b1d8e101c
383476bf7078c57382c744adf48aeec67fb92fd8f319c5fafc81d2fb7fa1a5c2
8e141f13387a3948c72133342121313121560721313121ac9d8b34eee76626d4
96cec6becbcb19213132211c93213130217d916831213133219da69d75c043d0
8fb71d23412a1fc26c5c84b66857213132211cb7ea677dd421333321434981dd
9b2bec73f51871e6b5de57fbe09f8258f272a9bae71ad121333421042e195b97
1ef8cf213130217bc7bca82131312198c5f2d7c488ed08c3b13d416f7689a184
7404c3738939442131332134328f6244f63bd4c506f91eed88c7bf74f62f69dc
ea760671b3316b027ad751c75bdf95d821302133ff56e8652436f9f2f750f2f8
dd769f79cb9de2a8d460f788f521333921a253de90a2ab150280a9c2448f5f79
88c86ed1d67d20fa02ad5cb0eec188b053292d4ffd21313021c07b8e75d7b111
21313121aa95cba25d72d6b3eb2928c6d61d2c2059d636b7e108714df397ecc2
20636556100821313121bce4eafad521313021828d96a93718802131322171d9
21333321bb2b2e2b6739abbf1e5e8c55520ef4e981426cc46096e30528213132
213ab9f7085515479d52b51d074f15f71874bd545e5376b43f5e7bfacee25b25
cd2133342117a3358d3588b10112144f437dde388e5aa8ff6b56dc8b63337972
3054878b2131302175c23ae2783a209d4a478f6e585544db59a1036898b77c80
05e44c24a80115b323a5ea5d8332a79f42156c41ff50d68a213334215ad41103
8fec9efbcd9e970721313630212d85ce88407318e2478d458dace52131332139
cbcafd82a520874fc37ae0962f0684af978721313630211f593af2f6701a2133
3321ee8a256f9252cfd8ebc5d3d55321333421ecb321313321b3166c598dc56f
84bfec304ff32b21313321ec4579f27edaeac2c58b434f5def142989aa47f438
1250c11288d47eec62b54e72dc41141521333921a933d00570325402456a7721
3131211f075e9c61466ca4b4e49ed4ff213021603aa968498104e1711b4c4225
be6f4981cb8f4d21333921f56020d715a7ca0f42120246902895ed93d9292e42
21313021872f2625d7b675904c213333214bf77be56a48481ece037f5bcaad2a
800673c3e652d06d7de6c14754296be0bd45e4facc425b8d9132634aaf154329
bf66b31569aa17f35920a636b552dda64e7a77c5d26b0793d25e21313221776b
60ae61555ab408b8b45e5f96f65258f75047792d13f5af788f1badddeabe3096
9463a72d3af359a8c55e9741e9120701ae67ebe83921333921f868367eadefc0
1cc521313121d1542cf1beee0287081490dcd0a9aa8d7a20c4f86ed5f06eabe5
7ec1ae86ec2f188397e173083dab197c115c1a26d0213133211828ba3e109c4a
202b9656e4e6db38844814adddf201b6c917f7ea8fecf0da16bbbd1cb3475dcc
213133219a736e9471ac3a05833792f064e3338f1ac94c3705e860ce6b5162c4
c9599718dd9357a625f6d4d148201ae6213333216ea4d1934c116ae8d58285c5
2f5baf3bc3c54a36e9ea729ff5809697c7dfda2ab7464a409e2e356c69d7284a
2b21302157bff99769213133212cb12323ea213339216907d304e7dd49bb192c
6e13b2a5b394244921313121ed21313630215c742b145b7d21392101e9b78377
b76ce7213133216ced59b251de45745977f6164580b7a16e6596fbb429a5669c
20b84cc9fb7c347823804c563a9af3a1ac12c5a44d15b86565972ccb786d96fd
c83753621ee0d83aba9b16c29a54cc8954f6dc64e654594ce2f3d2cdbaf2679a
f54e252139214311d471e821302158c13f56d65c3f588b5a958c101fb1f49f80
213021fd787eb85ca4a7d548e6ee889c21313021bb91e13fe5abc2df8c9620d3
4906526974e8b22afbd151112bd098191a3c96b09d75795952b65b518efbd2a8
9d8f95696c59d02131312138b9a92b4313111a0721313321fc4becc774ca0715
30b3478cd3ee1e85f3a5bcd0e4342fea6ee3ca7d4ade33bf3af3a12133392106
1e49cf21313321f13f8172954e9dbf94a891c1b877ea98705e993910464eb145
63ab7d35f95b84e484499e93bde27dfd3bc45b8d04a128bab641c0a7073a681d
e6e61f3925deeab763e95a0804cdfc2d707c1091a339b568bd70e41e6afef4ef
3cc8f41858b7e06158af753969b6b0fdbf995fbc4c8f90d119ad35ad6192adac
237ebcb4ae445adeb343d12db350d7163801f111347ad71321313221c56feff4
73aaee19c0ab5f75dbdbd06a90609d402dabff1dec21392191a316368efc30a5
5d0ed603213333214817f8eb44788b1b985c5c8d392b55b293ac3012c1364bf3
b726392ddaf0c9b7b61d3abc01649d21313021b559b14f9735017bd1e5c52ffb
8558714c21392148555ee8b85ceaf97ad40706bc8f04cb493840d857c8fd1677
06ccdf037c99f0456784213921865bb7749dc52e5d6d1e0556c8cebf8b4c373f
d64c163ceb9f8361e6576143839d5710ac1755bfd5adb36015c63db2bcef2411
9088b5a3bbb38d486ab3c58a989f213131210721333421bb978fb145ae260460
88999960e7ee7b82d7a4759601ffd13cc53a572aa340ed242f21313221b723ff
bb6038aaae79aa21333921ce75e140884e4baa57435ef37018afaa95be9fb02a
c91a1821313321e4a3d9351a72da12ac2d44038bba86d0abcc8adfbfd2ac2879
9316c6ceb07950f29366aea16d73b3b705e164622b17213333215026c132d418
723e52e717cb3b3c6987393eebca328e8c213921d0afa1a17f1f70d49e898b2c
63a4c082659775c6e9cd610360fc49ec7d2130213ee8c0dbd9daa97a38694f89
3a8542b6599e9fd0c84764d721333321fe2dc74426b0ea2131363021326f2338
1b7fa666b8153d44bc651b23dfab45651c9ddaa8d4b23e4021333421794589d0
7ad23cc0f6a2c101f86edf3976b12131363021a17a022e20b6dab465a5ef4421
3132212139216e3e57e1ba47c149bb455c1955831106ad50fbf23e331c9c5359
f02131363021e69201b0e3213333211c636a2058fb1584fa10e6b92131363021
6447962f9b7a9e58a77bfea9c0672139216f368dab45068b91b01c7ea34cafe5
062ca6ef8dbbe079852417f808cd372b8819925db8ff6ce126fc21313121d7bd
b92ad7b71843913416b0bb686a56dcaca6565c21313630212c84bd29eecff228
fe883170387c78708a4acbe2fe4b46ab97e23853822133342146ad13afc17cb6
a9503c39326c45e3650e736791cb95e96051b77091d807e5accff66667cda9c2
10308df7583045820ffad13a4dc4f2c72131322118f824fa6de1bddf71a92131
36302174e719cc9feb9e8855bf6eecd0f085f9d93ba8739624aa64fb6c6a2131
3121287a6271071f21313121b2128ef9d564e25e5db1e6b1af2afdae8b5e0e98
f5cf2bbb42572b21333921ee6179f1a1742139212eb0ca69890f6ab959a30536
f1319d1b84866bc8c6ec7b549410fccdf521313221e2561feafb7b987e90d432
e1451becebbde486cce1efc7d2b32ce0582b5fbcad0170537091a8b1c06f8763
9904f8182353b1148ae55998e0126ab946030161bb4ad46a69a7ca9b6a9fcaed
e8213921d511eed12bf880d186f475213133216bd358830143f0d7138864db49
a129e6213136302195c75a85e1c398f3ca21392102bbacba9b1c403bd4d39896
677013cb6f5cc105872a80765af0f7016b478e674cbce27e37fac24f6b1ac16b
26fd833b8d4b999cec6c89abda86a6df5528dd24f65e6d98c12bc707f539035c
53acb90ff02ee5505bcca5576bc95713a851c5d1438935213921a5139c2c2131
363021909889d22131363021e89f19af40d36f966c37de0582151421313121c7
2131322124213333211ee5cee1e907daf988324e3a97539f939cbd95f94c076e
9c5216cb1d46a3c4aed17e26871b8dc6b167f796990fc441d147bb43d1af3f2e
46a33096c2eccd45f83cfacf4193d352453dfd602db3682131332151603011e7
de2b58f6981171fdb021333321b4c99381bfefd7c3f434e8e41fcd618b33f02e
ba176ef04bdd3a52f23c5a5e5692dc103155d2ab71ff023792cda1e14988bb3f
cb63766cbe3c213921659180dc268a934682073e97493be96611e78e0497876a
de72f8d3daacb6aea1dc7f353f9f8252cc7530961e95a4f0bb21313221a18ee4
4f88f3937effbdb16f2533c15039405313e36be21b47b7b1383f2d87365dcd21
3339214bc68dcad278c121333921bf43cdaa3258c76ce2c4b0f26c872b8b6574
78d52130219f88483107e3159be9bfc9cc041ed5857d543c13cb3f4b544ce079
340275791607ef63c839ae7068542d453021313321561f16c748e89eeb59c8b9
f902fc1e21313021bc33df83213334214b213131216099b34a822ce1035a4621
31312190213021758f6b4dfc8dd42aa226644d4d98b36b5d8c45c705a29555b0
71c62c94cef57b746516ca8dc1903e52a1bb935b1d1e8ba2946c29f37e2a54f4
02e837d8f9fe59c85482925274a6213133214c9621333421cc5eedb75c132a3f
ced185cb738de7ceb7835647a5e3a37c5c433b1a962130219e1c72f03554919b
d44ec780d398981b55ab213136302175873a9f9b6e9ed249213921521a8fae35
72c05f442b02932348aff563c048bb4643a72139213ca1bb04ffdb694dc5332d
fd44548024b9ffdbd7cb71adf42f5ebf66af21302124ad626a2133332185a9e8
444a6bebfc0e512131312174399c52b154e556d02a737799d02fbd524ee19a6d
05eff6a74d396f1bcf2131332165bcd433df1c6938ffaa77ea7b5334b5da7d9f
694ce39afb60fbd620e07c9c670e403c36ec0f6607d49a06bac577ca38437f14
f143f6ea50132b5138656393e78d9908da213133215efa87fc19752e38452131
3221677444d9baad896d475021313121d20196f86cf9cd9021333321f54c2131
31213c7353cb36b95a16232d863d5e1215e11eb6a6aee7194e08354da4af29ff
ee0521333321b20421302164a4ec719421313021ac3166564d626941509a8323
88c7fa5afe9a55b32133392137fba86192d6bcc2c214eccebe6f01bca94b908d
c735c40184ef042543f7d93c8d9c690386bcdecc19f5a530c6b1e0170f780803
254930b9524354213021615b21333921844e2fbe13da7bfda92a251fc8a8944a
21333421c6cb9958ef70c8a321313321b570f5303904a786ea1f2fab61069091
d03b2133332121313321534a2dbe2f94beb9ab4375a3206c1731213136302114
f8b6213132210885802839dfed7433f84ce825376060213132216f557d259be1
f3e6a141e468954521313021dcca2e6c3e1979b0c3828ca74798f60f947ac1e2
71e43cba55f7049b2eb0213136302159f545d11c062e8645866808514ae4d0a7
342131322121333421e4e4418712044aa239defc5e58e5f43a3a6bd2bd0edab7
b23089981321333421ac6e965132b6681b61863f4a5b07ed5a71c79832d8c5e9
1b694515f0b1494ef8343ea9c21e14a2334916b26bd4ce5d137946e42e9540e5
417767dd4c1aae68645628e18067601304df3160a1079e87bb676e578797475c
e1fd1ded5a61905ea9aadc1a61d789fd21313221394e45131fab2cbb47bb1350
36e75df073213021d535e5be4bf04bf98e11b2a7b6f472f4b3d82e93d6b25dc7
fd6f213334218b4ccd213333211e1df1fee947aa65e1ea3aec6773dd6b3b9cb8
bc021e4543bde263d98f76de40e047ea15d65a75e5906833c349213133211238
63ca1052db1d13bea2f528cd7efc96ff21313121bad9371eb35751dd85baab54
866ebe54bc4d9eead044cb3520a195bc38376ff8441547c7dc7288f4d15ba51c
39560201f769bc1175a4634cc1ff4d6321313321213130216e50891a60d03207
75a687989b57f3f353fb7337ad12421f565651873fefd8660e0892d5bac02131
3021e5de833591e1e8cb8ecdccbc8d9a21313321b27f8618c3be7121333421a5
5dee85f355643a21392106cb82b6e786a293bfe41b44143f66856adcafe508b3
303e2db3c8b37fd010c87c4a9e4821333921e5e7a3bcd8702c892f9f57747f39
058f57b1b921313321196165af35e356cec4e94b964250dca672b1552a793d40
e508159c575b72d4757d362bdaf0cd7a464dfb33c61c21313121e0213333213a
aca31946b3ef2f9d142685d4a9c4413e6821333421bce1bb5b4b814e7b15aa0f
4469fe41f8a84f6080f404c45ad0665f5089c89acfbe925f2921333321161655
67dfd2f429cfca5431aa30b7213339215248e61b32bfe0a5cbaa56667dfaaf21
3921bc1359ba89cf8d4b592e17e29df74fbfc0c0a9407485ff6f20a15cb6816a
e9c116bba2f5d021313021879401861502f9f9e1028b9033d9321cc618edd6b9
8d21313321a3a98c59f892689adde1d591d6f05e8f98598daf029f04ad8a602e
752ccc49d4b4bdb2da42d833a3d78bb908c821313630219845014a7fd4356bc5
3364e1b5262cb187b0c0986be68703ad9fbba9af57b34a374c3e8311e38f20f9
2a053a75086398d762d5fd9ca24210ee8710d616064858839fafc9de43b7c34e
145ed1bc8fedd05d7f58d42f48c31eefc378954f646f01d051fdf0e3cc3038bb
8becbed421313321febde14ae0fa1c465e6dc63f752a109cc95714e446629acc
aa5ed6a9239f412e3f19688a37d58ab5c2a6460699dea30501eaedc61376da84
213921ea74da29ed31d5578693bb2cd7811530cb62e9f589f62131322125470e
682b32e269e6a78ab8cfada536b5fe031160083cd2cf6c037e1343f348834d33
991dea35d941fbaf49f5e16a213021edd43511213021d99c4c79a4e43f26fd94
e160469de124abb53da78d757dc438b43b5221313121b7d62ec6b5bade1f123c
f6bda5975d41a2268352a2f4693abda11a4d2130211294213136302121392103
6ad8b1deee2131302131e973e5bd5f1a6a6b853d778036d35554a8e05580ac34
8f2131322133387b30232cf8413fa67504e8cce114d346faa6769e89921c376f
b5e65e7d24e2b5db86ce31bb77d7d8e45e452dfd213132214f3c4bdbceda501e
c5a8f7fbf7fbd53b688057d58af2b2909a2321333921f0b621333421e62b2eb2
5087213334210ea9bc4231a56a06b2fdc69d930456894eddf479213921282fa2
b191c44f7de03f242486b11ddbbbc9cfc797eac4257cfc7baaacd44090de1dd5
f98068942bb0902fee73c63d21333321679a5321313321b3cd3434264fa4c058
931c6d2ebaf696f082f82d62c2d7f0213132214d21313021833dde29e4787ef9
6b7989b7ff617280737580d52131332117f368c15324e28308051cdc983c171f
1380b46e028f0121392188ab21333921ddeafac812adfbb00ebae169d303b343
cac33c7053208a202b89642a16705cc1c908d66b96feaeec3ec51159ba8cb777
1b694c5ea24451bcc169a62133342118dca180908aa54a948419e6d4e01e6405
f80521333421a26c73af16f92bd05808bea835b1f41ece6dd2f5427a3e99fd8a
102bc7da49dbac6ed279ed4f823b3a832687036632b11208ae01153324bedc56
38761812b7d9fb28038ac2cc6f46afeb81caab03b49d21313630217d6d759cc9
2cc0abff76764c36a290c877d6bf28e7dab9e3dbc4731d95213334217d16d839
8065e142e4e7c0f65b59d02cbc8b3d6789a27d44dce76d9d85b0901f8f76e0f5
015ba88b833a1cd9b22333134c367f3c067321313121d82139218c62ec372a4c
f3aeef46b3feeec0ed9e52572d100237515ebef8c5c5d92aa6fac165e7b1f802
3de921302150714d213339214a4bf18a7213c248d5213131218f108d36bfca55
4cdc9bc368ade2a506741f6034c2b443122c41863eead442ff4b87dcb2a5aa19
99716c1fe221313321ca8a1949a2b1a92560135c67e44c945e741096941d502f
193653966efe842a28b9db3663862133332123213333211def943949b1e0d8d2
56913211246c461a9721333421ee35cb6708e8912b43213133217b2c84cbca7e
c37ca8372131363021cec81802db65aa8621333921b450bcfd64cf5c4433e2b2
e9269f7b658430f164755d4b21333421b951a3ad632b2b4225aa9c63986cf421
31363021a54c767c6acae52c96e52131332185141c038fe955e6e7e99fe4d82a
bed34c5968bd01043ffc40a1117956eced4a0ea9bfbd9a21313630214e213133
21bdb47bc97e51daa1d19b0f358cfb99c4d4174c75468392ec995499055f2535
968d0e31ad1de91b6d213921c83ac416d3f6e3e5cef6df339dd89e21313321ce
441fcbe9a53811259036db8c9b14f0128232b460187f16db3f0ec6f45f832131
312115612ebd1289474af775c664213021b6452c7758c3cae2c181fc63c33d56
afe0213132218221333421425956fcfa2c81fcf28bf2d1d86ff723ecc9831a8b
3960e7d23eda70909d16f686102dac951c93ce40e67a8ca5c53e8f1ca323b6f3
6788b16639b3d45a5f6bdf7a28f6b64a4ca4dd44cd96b1c8ff41cd1a893f8fde
446ff121333921149b58976942c38b2139218052c721313121444158ef3c5c16
4c069421313221777af654f6e3f287e02130212db0334282c2f3d433dc990f8e
828213b0b3733a8bd4d233bea3c356b8fab676879042d93a6d15e06f5ace4345
c6f9925f3871c1755eb2cd9348722131363021dd4266e508e8d56261dd61b83a
bff72db159d0b9b4c27d2fbdf917d4065db0d0c02131363021e2f8f9c4e75dc5
8f5db27e02bb401863c44a31251ad658ebf4aba49ec116f6be90297c60dfbae2
029a4f5f7bdad8c6fb51ae81723543abe86903113b0f5116a2489c3b3ab7ce24
f502487a206cf0d2dcf5fb48f17e2133332121313121dbce4a8bc3da5f213333
21961c874aa9d4a854cb2131332114d75a2131312155aff4b9d79de55005d006
c1e79f4c494cba068245869062e4fc8fd09f7663bf6b77d04c83419bc132e459
2131363021ca73ab49a61a5786d09ea92aeb42267339589e18213921ccdfc350
d7d3ca05d0afe213b7ae05d808d21c117d6f0473bcb493435695
Encrypted(AB62A70B7F8CCD232775D73381963E47330A6CEA)
8ce82df8684e8db097458c404f884ba3c3fcdacf2ad91be4a74021313221dae144
c2728565d03d2d8dfaffe1aba5d711bcc24bb6189348054ba89b30213130217a
071621313221156b68b6a78192507c25b85f293c3597a7353e7a8562e8213333
2121333921334befdb972c902815a1fe5e46db382ee3f1f0979ac04c769b32c8
352ff773adb2b57bbc6d1458517ed165dfa5841f2e76dcc3056750e7e3e81614
3e8aaf213334212341e05e6325b777dec69de37f166fd749b99ac406a59045b0
b6aede122c3710c19fe13dc54c7b21313021fa3dc436523af0da2af84a7602ec
3e64e3184b625559e206965595e1989f8aef0782b7bb79f94b174493ab91acdd
f56de3a303bc561dfbf0dd3d38749351412902dbcae747b068739fd621333321
ed645ace0e423bdbe50fc21bcee853d0d8ea355e936855d49c0258a886d4c021
3921b942b82133342146d47ba2c42ef514f72e268b92881a77d22d14e104dcf8
c36c830819b7a868ae3bf3d288b142e4305ac99676561a69256093becefc4104
1aa83f7962213334214eb6c50328f54f19f8213132215404b192d72c7d3ef506
36c31dbbe737bc284be9ba781f1cf623b8af85b9502131363021f797b6871df8
c9f9cc99ace608855198bdb12139217bc8da7d49938bf8e73ad63e781149c4be
c748be65d1936d32c94f1d5636e924f0fbe3587e533905d81edfb921333921a2
6f159cafa7669d302131302180c7e4b5a2ae9ccd04d391cbf116da70410e9c6c
38f02939c3fbf4e23c88c41f89bd89213333216f6805ff9d3a18d8546daa3057
3fa547b1707bd24a3fa16791a532a4d2f4e6599f506b733b21313021b2f51057
af74b518b7529dffd685d2679b51cad8f0de85550e783126bc9b9105187764e9
66efc435e4e57ac3af321137524f8f4e5a1fb742249aff96fc2debeb192380b3
2616213333214ddcd7b83f6b4b37086beb53408dea4510c3859c31129e213133
219fb32133392196f3ff479e627c8a1ddaecffccbcdc5187387568691f95ab57
9f70109bdc7aac289cba20ea43edb0e4213021fa44dd422def8490fd164ee869
2bb26c0ea1758a89f5047f862d7228d56d518421313321ff21313121e71a6df2
21313321b5898b784ff54373cf58844e2e6fd22a21333321664c02b575b67d56
7ce8fa333390f0db3f3e21313121ccf3b933c668dbbda25fc97ca5d2909ce0c6
78ccb33e801b039cf6b0383d353a96355d85e89523325b5713ece03a9764105e
7dfee490dcc29ab6d4213021d5e3fa34c161811d3ef59e3ab674384be2d98281
be37a28f3bb3b63eb66fe1847cc71e6869d330c666fbd0fa72fa02b7166c7278
c833e63f8662c3c7e7c2782a7f4f9fff7380ec1262fe87bd4c289b70cf498fa9
31bf1f43247be61c2ec11d1ccbf28314f49bf19a565bb6042b5deda3d975b11e
f2d3f641c16ea2e1944f4021333921fa2a670e3e3036b3231dfb2cebd704c476
15b9ae77076433d11ac54ebe82213136302121313021d4463958a8915e2b9684
fcf5dfe5c6d6aee93d77d713c0e31119b54c8007e920475d4ba5f3613f72f27e
354c9c8ae6567caf5b073176d421333321ceb029a4f4f3e83ecf5e281b117208
96c73126cbe06b2b4ec17fa83fae34e1bc7346cb58
Encrypted(F840B3B9AED0787D4554D78F122930B478DC8A37)
5b3789935939715ab43bff9959ef6dc220cbd4b93ef11f66985913172d60d14ce1
02acbadafe8aa10723d4fcbeeac183b8d5fdb04c96d9437349e9f6809933f5e7
30f7fa2bede596a4ec823c25cab0e3213130213f21313121039b3ead9485137c
2133332155cb72468d9a750edbd098f863c5a77432171221313021c0785e402f
2c9497c6031684ebbeea455eb30881b6b3202139219059f88e2e43cee439cbc5
16be2131312194519dd6672139214e2ca35592cde47eff4bc6442cf8d5332613
291bbd9bc72133332137d82dd52c89bad6d87fed268e30c5ee3aa221313121b9
68206024299c06d14daa4fa437213333216e7454b76097299a93fc48302419aa
196f106780725b7ec5f8ad81e5605370679c019301903521313121918616c3c5
76cb31f7200762d8838a231956fe761b1245d7e86e5555d89778c75f9970d96f
a37621313121a35161b7e20f08ab49933b999142391b2da2dad959ee9ae9ac7e
c4db654dafdae1475b6523c12bd89dda2cfc545f88f3213921d47736aee125a9
77c4d0898513e344a280526f2816443db8d45a21333321e24ce021392124d241
f7b9362b615395a421313121af072131332194dd17f91f5fa8c91c6e4c60519e
2da323e221313021b2ac6eec6f95a12c5f92014775032131302147602da15c81
bd18d618919fa72996c37d06f1ef1725945ad63a43d7c9327be695200687d1ec
5914213131212131322102c330775d21333921eef207ce7c595b69f8c6b07818
213333218fe2ce21313221df535121313221f1e7b8b1d07e7ca2888db5fcfb1a
d7cc6d2131312114296ca623012cf749827919c1ebc6d75e81116997c8ceb47b
bb4c772521313321a98c263fe581af3cd4fe168718d02133392114e24f43cb5d
81a35064edcf9593e0402d67cff1c66a4b166e630f21313021b0b42381fc9a17
7f91ef2b20eb5c558677468a49d055cb82919ae482bec3fcae8db26fcbc02ac4
5863331bc7a1f9aa0ecbd132ee368bb9f1c2bfb2827d564ff52133332156f4d2
15cd2d7518577ce6816421313321f66e285b24e0bb2131363021d2823964f5aa
75845e0661ac79d2bff72e069f961fb421313321f69dd462213339210f6d8c98
caf81f7fd7c3e44d429a932e7686a7b698b0e6f5e7dd5521333921f985c84f7a
21313121e14ac78fc51047c5c205953cd82139215919f2cedc17565d66065384
4e24149c7f1a3f905641cc5639987413a4e3231afcb5f7213339217e705941f9
ba77ca026d77ea601ccc4c0f8e7e8af182d057ae29c64e125d2131302192192f
ffe9e1e3dc3d2e13e40e0259aea42e817c6250cbab17309cc242f9034d4d1aa5
751e45eb4be73c1c7389d6b853c05ab35eef1e77562db80f3cf226f59c3da685
88bede6b39bb7346f1959871bbe921392182232bd83e648b7566d52131332166
245aede3ba8df406b5a2added213ec2c6ebe39feb3318ffa4bd7beb7ccfbbae0
4926e25e21333321a96f8e6d8450c6437ff0ffcd38b850ab6b7e53c5b0adbdea
ab33613649dacc4b213339212a213136302150d6e77a3cc36e352ba5d39ee26e
3bcb9ef8b1c3daec61a8be05e453882a7c9789
Encrypted(C6B457B1D919887114B5594BE8D68C702EEDFB89)
ee8b84026821333321d47df449cb5b9f1ca33e4a9c9bfd70ba67769d2fd8ce7437
6fd832b52131322185aab08471690f506b86ba829cede33382dcc00f393cda26
b694ffb13f213333219b0632fbf1545b4a057bba08f22e346a34b47521333421
bc1fe26b6af3c768bb8415738762a477d13bb6b88421333921fc44b8e4213333
2191d214baf794734d4e4f76f7a96306c41c3e874244a48bd94db30e52866121
3921f913b19b29967e98bebc800370c0b816297740c24766731e2f2133332134
aa8c3d58089c41d7a14455e193b77a267b31213334215add2a7396f81e8e2435
da6833c29cdd5848ce122d646d254a329280e9213133211362d63fa748b0591e
08fd92e134c5e5e09d30336dd6da4f5a21333921f976552a26eab408d9c6518f
e9949dd9b925213339217bedb2079319501cf51a0803013cdf11084bc3e8ea75
d7bd0e43eeaf4d47931e2131363021b8e9a2484462b2e8ca7a33ee9120213136
302196f0b749e48c71ef3d98ee93c0937121313221
Encrypted(0896E76C519D31716193B2CE582460F77C2F1AC7)
686421313221140f05db7ae9632e69e82131322102f4d3923565e2932133342145
699508a5c385ad2aba3e30bcc2ccddd9fe9d029fb47bb7e37270874d26213133
21cb2131332188715c292073177925952447a17072a3feb2596e3a3c1efd4229
67be85919321333421e699897d1818c25eb35647ab6b9f9c5e8fa8cb871f9247
61023e620221333321f5b3edfe56d9a988d2292131302176f1f3bf87c3637735
46a479213021bd144ad8fb3d6ae03171f87c442133392163763a6e6b21392177
962b889b11213921239e90213131214b42042afeab6d61ef7c7e30901930869d
b28b65695590c4066593a1213334214654d65e42c9213131211c69281cdee49d
9d7a949c83b4bfb750dffae12bda5178bdd453d9699f4a67069a1f494e203f85
7e531c57351e484cdd61bb672dd99ff5598b78aa3939b5e43168c78b924f2131
33214f6c730f60ec8408d8c0b712502131312169e265fabd3d8f6821313121d2
51ae718133c4f1b0f089d6d8fc5563e4f1a1ae85f3ec3b7cf8086f21313021e5
701f2babd9cf054a710f80c376c654fb31209c92d5ae8523cb94353fa46be8b4
82104c4a1d832cfcedae170332c777d043cb72f9acdd4985f8e12d213021faab
2fe669ef7a6d46875face0a91c2e1c1c62a371ae28bef0382d213334217c3e54
7e577accdc376923da6030beebf6d59f5ba73f4d15d6a5c86c557a1e0647b4d1
935a9e28035996437abd314d4eff8467583ea7ead8c39c70e1f72c6976116e66
141e88527f10b0c8c06423919c065164e20280af6c5bf8e848acbe4ee940124f
c9ac43af676f1c121ae240757021333321fcf1b9e75ed6a820b10ec393a68df4
6cbda75d87ff0e48a4f9d46711cf3f43326ff6a663b916082320866b5d7d7a88
d821392138cd18bca5b75f5a6c449286a3b605f87dc5b4025a2e8a5fb46c75b6
899c0eca75262131363021fbe805acefa19008c2139aceb0ac3128cecd8f9c58
edb621333321be0e6b4d8d3bd28e055421392181d628901e554ea2763a2c50fe
9f1b6b83cfb2a5c3de7f6da907b11d3526d6b01e29202130213ca7a54a196f4b
a7c1c26cae1fce648575567268adbbe8ca74a119ce545c17b2ad336aac42902d
1740f69330f24c4005f3e2e221333321e11ace4a3464735434b621333921d981
262131302154de7f8b3688213132213b77b63ec3de3de73c8cb4149f837e2131
363021aae29545c20199e7b6f4e5759e2421313021e4ac4f7ddb3073a7146be7
ebcd7512147c051dad62c38eb29217dd2d59e234f88d317af793b6e31d7440b8
372d83bbaddc5f1de78d16838604ccb0ac104b83959083ddec9fdc66b9f7e61e
bd8d886164c2ff2133332197559cb5177eee66ad075c1ca770dfd71a0f24e22b
c325925d578f240fb36bc74913bb8fe4cbd69291689e2968e92df0b688f44f52
72838185394094b78e58a295e60f2fca8bdb532551a8b862fa40a5511de379a1
f4cc0e213131218dbd2bacd19a7f829a47f5fd4f8a339d21333421f576d729e8
3f213021379cf0fbb88a4afc3b5bf7b2fcbabf21313321560ecfa16832a4cdca
9ee22ad27701d14bc5042002b53ce9f269a7a4a2b7a5159a9319d0a53d428d3f
75a2aebac8fd6e8a9a213132215f1379eef2d16aa863e1213130213a9a05f930
fb1a87ab4f387137296b5852a5127b11213130219a07cc598ac0da4477b0fac9
cdeabb46fa53a257ac4e0240cdc6b4066936465b2b9fcf8b8d3b688a3ee9027e
e7e1adf40e98213130214480763ca68f745a6e5546c0f351448056286f213021
267d5fd4bceca3419b7369be38c2ee05ef75eaa1c9ad3046aaa6213130216391
b4f7b89840cb8abcd38285b15829a68a18348645a4d46675f776c9c5c23833cc
136b614b197e97e5ca21333421eece52e723acf023cd28fee9821c5f21313630
21ab36ae7315de6888fddd2333c78599cf21313021c733d230bf6ae710c5019a
9bfe9a617a1cbeb90f21333321ea368b21333921afdc9b16cb2baf42cad6a9de
a2e954834820d433128d0571c1f4c09e5f146ec5c649550716b47057719cd889
0e17e27453e812ac715d12cc905057e2084a8932752dc7e14bc3314f34c2be5d
c1c768e5a79b5d06a14ee7b1a6bccd1d853730bea829b4a2d58567051671d335
ec2f958f2133392166ffe15674ab88ec01947d7ed3608079108194ae5e4c79bd
abb03f213131219634cef3f08c9cca21313021d715dcb5e3d623b6cbe1479337
41daa2681bba213131212a02
<div class='header' macro='gradient vert #390108 #900'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
</div>
<div id='mainMenu'>
<div refresh='content' tiddler='MainMenu'></div>
</div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
Encrypted(397A24A8D754DD4257AB38C1503FDA0B6B46441B)
80e62ba27fa8ccb55b24293f9b298521392137281096328c3935542e7f9055945b
d3ef9cc18d257a21313121024002fe8591f46b47d7def1eba99c0f01fcc91601
0677441156ee6be865213921c3d4b1902bed2065407096ea29a7fa5921313321
a3c18015719438213339217bebd9a933de1e01ecf189f733dca8ecdb5efc6e70
554d03f3fac3a9d8fe7f543d213132213f9ebd6ef4d58b495b62213021cebbd2
5d862131363021a41f37f1417c256c7330971fc271ff992a712ed0b0bb213136
30211352d025d72821313321c09a213921054a64a620343281df11a78901c856
6c4e554fd2bf480140cc7c7f4b56f61d5a8fdd5cf641b05ecf7b21333421d1db
c5145c999d6c90b1d0a58643592b361f1834ea7abb109a23de7d16be83a2eb13
83e9f452b1e779f03c78b6f3a9d517ebf821333321e75d0ff9ad6eba2ef25a48
99f265252c953fcab5fd55213132211f4172a68f6501cb927d9992ca94213339
21e3d8e4ab30048583698da1c4213333216334acf7b982ebceda854406b34c55
2a463e8d72ffbd0641d9418e91b5f8359d5afc1191f0451dd2e12e2df102c745
50b9e14aaaf06fee21313021046a68a68bb9635daa142985f77575a2aeba2324
5e9b92491f55962bc3a804e630115daff5855c20746776d8961b1c05ef1d5674
b57c8946fe21302183403753a721313321f3f741012133392146f3bb6dc9af9f
2950a12d6762e96921333921b65cb7bbafb95b56e7b67685138568888b7da4fb
4ae0f09a45639621392189944ab47646ebc98269402dc653b0174335bdbad976
eaf25fb377912056ecfc61eb01b9893ad31fbc53d8e6db6f12b77e213131212f
85eedc82e4f82131322162213021d554960eba67238d8f4edce94289b072abba
bf726edb83b238b5f1b6d737c0bdbebe7f2485e7ddf44e2131302159b37b8c56
0720658de9b924bdfde459026c52edc72139215b11dadf616b2bf95f8213dcab
1ff9e99b2da4344eef26ab891a1df9e2102dd8265f9c60e3e45652b6d2cf918b
268c7355e12ce14339fdc86d252680bb6030d62131363021fa9e213339212895
37ec1014148994ba879f786aaa08a62ddbabdd4969cb2481ebd81bdcce4c20f4
1dfbc7374cbb57904ba23a866958843bc314b380af8fbaca35d060174508cd5f
31f3d7348c4f8f91db5eee872133342185475cfdf26879b52131312121302186
d2406c1af406160f6d8a4ebac4b98afbdbc05cb8c37aef40ef213334217b36ab
e4cd8426e78f06129d4260c8c9163aeaaeccf5fcb1a197af5037837c9294513a
d66342d628e8c2deb8c68e482131332150a47bc4ef935f2a3cfcd2d6f9980fb3
2a2bdd7dca5643b7bf5eafe662d3f8dd498bd44c213334212e6b34bdf4e63e48
e08a2b9a34d4cef06e75f3fec996a1e4e0d1b1c53f6f1b6b2131302115213133
21247aef55905fbbd404688cdc4f72193bd77ce64986e350ee213333216e4b6b
2d8592a96a0321333421d6b4901498922133342165ae1b68e18b458021313630
21b1ba60102aa8b19eec44213133211e3f268ff410bbb9ef72e9241376fc7031
bc9bba89a7b2342eb495f73d251b94ccc56bd5e5e3ece1a648c9e9f3eb1a24fe
a2f542ddf7388332e8285f460889efc1e9f2b1110ed2629ead3c5c81ab213921
ad886bbcc9f97d0fc7cec996eec797debe95a97021313221db088a2131302151
5f699fc5ba3550868262bc72213921e76d3dfee172ee01cbc805f7f2c86cc442
a65b30be3bfe3e51ad4a7b5774e5317db5cae15d79c3b72e2131322153ed65c4
cc1ceeae165b3b2da9f330c02dfe82382aee8dffed78d0cc3d9fed33517c5514
2c6b96213339218c2fca6cc9e1ae911d70a5403f265621313121a242628402df
40a8b59cb4c987a6bb66d5109e8ba31ee69d2a593c33f1257970213136302121
3921ed1633ed593e213921c3ead3b8d62139219dece084e007d23d411d7f8e4c
c3917c847d6075b207b31aa8ee7cb8de73178a5480a723b17042fc78ec45111c
88b3b039d7d3b8e64d1521313021b89cf4ad4d2ba9213021506704b568ac5011
6b47c67287b4c24b26d1df6c68d565327d2d5d1b0680906250b3ca3f2ac872e5
7fdcaed414f1cddf828593dba9d9dc57aa33a59d1c2bd3d77be27b2130215846
1b4b1ae3ed797d14eb57562a436c709bffd3e5b2b0135370842a4fb7e49e0638
5dfb1d2133332149821548bee8b366fcd4add861877e5eab9dfbc83ef0cba621
313121691a8021313121ccd9f89014a735bcabba2999e4f5f378448421333921
8dae7926937ae5d6f9af2e1a47e67791e7076b7c4be064bb23ba358f54f2bbe8
c6ecaa1ff7070e2521302199a3a5a5bf5feb62b192213021ab2d41fdf733ff45
3e924caeadbc21333321401528477cc2bea8f8564d84d156d613cbf1e5ee7ae9
b53c0ffd3ade5a347a764a26b92479b9a41cb4df2f38d3eef5e99a2f60e51692
48da9321313021a223a87168e7a1e4b37951731153a5c6fe35f4c87d1f6be996
8375036907cf865836213021b27941f848fb2131332134bcc247a37a80de565a
5ad9f06a5d6e20ed45b14ca232380387a31d332b9d21333421e17e7f2ff5b025
6e7af94f9fa6d3200fb4e21876bb9e1e95195cd4af43209c68fd4f85fe502a86
1b4361aa1eb1df645121333421151c705329419680ad406b3921313121bb6e04
ef1ee09b5a59c97bb1213130210673ee755b1e3d3b8a4dcaf29e57bf26efd375
17414d85724eda445923b608ed7b589a7d596187affdf545f48ef12131312169
21313321322d4b182ea608ef8d42bf2131302144a68ed43f5dda937a9cd388cb
21333921b715fa77e5cd9a8b71075021333321057583be751cea611eaa7fbecf
fb7a05bc43c6b899fc1b5eec4649b82f672a01ecb46b21302182c0e98dfd4a1e
05e56cf702c7f179706adb5e2eb74da1eb8e953830363c9b5d8f769b0e7204a9
cee5cb703521333921f3df741162ad1307cfc15c521cc1498d86dae198ceee3a
6b292133392116f1e73b35f2db40f1cea64390a342e9a721313321acdd3af4b1
4b5c812139211c5e077b95d0546bb83856e4f24b97baf3f17d38c59978e1d7e0
57b0701d35dcf32f1c785201a90801f4f858bacaa57ea324a7742d3a98304366
5112d5d5a8eb862a2b953e99213132214a69c9292921333321814908fe013166
409ddde5082f7bc821333421c9be7bbe213334219199d649b7d6706f777dd969
9e562a3cb34ca555730e394103ad7875118456edb7e133ae9b46b967d2da8c82
1f85581f53eb77ce55213132211b732d8f8a74bce94ed7e082456ee9b5181a32
df6a99f3af1cbf36a2d54b7158cce929a789808d2926b4ccd54416afe2ddd3e6
e5d3c41dffde5b03b3c7ad7b94f08457729d3ffd68c0e85593b1bf98c1fa6de3
c97e2811632d1e440f8436a9031cf273827a6ab4b049ad96ebb9d6d89ade2412
4e047c994253af0e4421313321a81ac49dabe8767e018306ddad49e155a1b459
e60f449de360e77de2f97e448354837e20f76ea17181e67a2131322140475ae1
afd865e0fbc7213921ed7b5550b5693d94515376b5c9cb5737e0c9d30817576e
213339212b4190c7350f9826523c50a66c5ca88c17b5cb23a4bc60c3b4ed6c06
59855d99e8bfbbfbb03d650886bd80ecf76f861e865e48b448617c21313021d5
7e30474f51b1d7a4
/***
|Name|Plugin: Scientific Notation|
|Created by|BobMcElrath|
|Email|my first name at my last name dot org|
|Location|http://bob.mcelrath.org/tiddlyjsmath-2.0.3.html|
|Version|1.0|
|Requires|[[TiddlyWiki|http://www.tiddlywiki.com]] ≥ 2.0.3, [[jsMath|http://www.math.union.edu/~dpvc/jsMath/]] ≥ 3.0, [[Plugin: jsMath]]|
!Description
This plugin will render numbers expressed in scientific notation, such as {{{3.5483e12}}} using the jsMath plugin to display it in an intuitive way such as 3.5483e12. You may customize the number of significant figures displayed, as well as "normalize" numbers so that {{{47392.387e9}}} is displayed as 47392.387e9.
!Installation
Install the Requirements, above, add this tiddler to your tiddlywiki, and give it the {{{systemConfig}}} tag.
!History
* 1-Feb-06, version 1.0, Initial release
!Code
***/
//{{{
config.formatters.push({
name: "scientificNotation",
match: "\\b[0-9]+\\.[0-9]+[eE][+-]?[0-9]+\\b",
element: "span",
className: "math",
normalize: true, // set to 'true' to convert numbers to X.XXX \times 10^{y}
sigfigs: 3, // with this many digits in the mantissa
handler: function(w) {
var snRegExp = new RegExp("\\b([0-9]+(?:\\.[0-9]+)?)[eE]([-0-9+]+)\\b");
var mymatch = snRegExp.exec(w.matchText);
var mantissa = mymatch[1];
var exponent = parseInt(mymatch[2]);
// normalize the number.
if(this.normalize) {
mantissa = parseFloat(mantissa);
while(mantissa > 10.0) {
mantissa = mantissa / 10.0;
exponent++;
}
while(mantissa < 1.0) {
mantissa = mantissa * 10.0;
exponent--;
}
var sigfigsleft = this.sigfigs;
mantissa = parseInt(mantissa) + "." + (Math.round(Math.pow(10,this.sigfigs-1)*mantissa)+"").substr(1,this.sigfigs-1);
}
var e = document.createElement(this.element);
e.className = this.className;
if(exponent == 0) {
e.appendChild(document.createTextNode(mantissa));
} else {
e.appendChild(document.createTextNode(mantissa + "\\times 10^{" + exponent + "}"));
}
w.output.appendChild(e);
}
});
//}}}
/***
|Name|Plugin: jsMath|
|Created by|BobMcElrath|
|Email|my first name at my last name dot org|
|Location|http://bob.mcelrath.org/tiddlyjsmath.html|
|Version|1.5.1|
|Requires|[[TiddlyWiki|http://www.tiddlywiki.com]] ≥ 2.0.3, [[jsMath|http://www.math.union.edu/~dpvc/jsMath/]] ≥ 3.0|
!Description
LaTeX is the world standard for specifying, typesetting, and communicating mathematics among scientists, engineers, and mathematicians. For more information about LaTeX itself, visit the [[LaTeX Project|http://www.latex-project.org/]]. This plugin typesets math using [[jsMath|http://www.math.union.edu/~dpvc/jsMath/]], which is an implementation of the TeX math rules and typesetting in javascript, for your browser. Notice the small button in the lower right corner which opens its control panel.
!Installation
In addition to this plugin, you must also [[install jsMath|http://www.math.union.edu/~dpvc/jsMath/download/jsMath.html]] on the same server as your TiddlyWiki html file. If you're using TiddlyWiki without a web server, then the jsMath directory must be placed in the same location as the TiddlyWiki html file.
I also recommend modifying your StyleSheet use serif fonts that are slightly larger than normal, so that the math matches surrounding text, and \\small fonts are not unreadable (as in exponents and subscripts).
{{{
.viewer {
line-height: 125%;
font-family: serif;
font-size: 12pt;
}
}}}
If you had used a previous version of [[Plugin: jsMath]], it is no longer necessary to edit the main tiddlywiki.html file to add the jsMath <script> tag. [[Plugin: jsMath]] now uses ajax to load jsMath.
!History
* 11-Nov-05, version 1.0, Initial release
* 22-Jan-06, version 1.1, updated for ~TW2.0, tested with jsMath 3.1, editing tiddlywiki.html by hand is no longer necessary.
* 24-Jan-06, version 1.2, fixes for Safari, Konqueror
* 27-Jan-06, version 1.3, improved error handling, detect if ajax was already defined (used by ZiddlyWiki)
* 12-Jul-06, version 1.4, fixed problem with not finding image fonts
* 26-Feb-07, version 1.5, fixed problem with Mozilla "unterminated character class".
* 27-Feb-07, version 1.5.1, Runs compatibly with TW 2.1.0+, by Bram Chen
!Examples
|!Source|!Output|h
|{{{The variable $x$ is real.}}}|The variable $x$ is real.|
|{{{The variable \(y\) is complex.}}}|The variable \(y\) is complex.|
|{{{This \[\int_a^b x = \frac{1}{2}(b^2-a^2)\] is an easy integral.}}}|This \[\int_a^b x = \frac{1}{2}(b^2-a^2)\] is an easy integral.|
|{{{This $$\int_a^b \sin x = -(\cos b - \cos a)$$ is another easy integral.}}}|This $$\int_a^b \sin x = -(\cos b - \cos a)$$ is another easy integral.|
|{{{Block formatted equations may also use the 'equation' environment \begin{equation} \int \tan x = -\ln \cos x \end{equation} }}}|Block formatted equations may also use the 'equation' environment \begin{equation} \int \tan x = -\ln \cos x \end{equation}|
|{{{Equation arrays are also supported \begin{eqnarray} a &=& b \\ c &=& d \end{eqnarray} }}}|Equation arrays are also supported \begin{eqnarray} a &=& b \\ c &=& d \end{eqnarray} |
|{{{I spent \$7.38 on lunch.}}}|I spent \$7.38 on lunch.|
|{{{I had to insert a backslash (\\) into my document}}}|I had to insert a backslash (\\) into my document|
!Code
***/
//{{{
// AJAX code adapted from http://timmorgan.org/mini
// This is already loaded by ziddlywiki...
if(typeof(window["ajax"]) == "undefined") {
ajax = {
x: function(){try{return new ActiveXObject('Msxml2.XMLHTTP')}catch(e){try{return new ActiveXObject('Microsoft.XMLHTTP')}catch(e){return new XMLHttpRequest()}}},
gets: function(url){var x=ajax.x();x.open('GET',url,false);x.send(null);return x.responseText}
}
}
// Load jsMath
jsMath = {
Setup: {inited: 1}, // don't run jsMath.Setup.Body() yet
Autoload: {root: new String(document.location).replace(/[^\/]*$/,'jsMath/')} // URL to jsMath directory, change if necessary
};
var jsMathstr;
try {
jsMathstr = ajax.gets(jsMath.Autoload.root+"jsMath.js");
} catch(e) {
alert("jsMath was not found: you must place the 'jsMath' directory in the same place as this file. "
+"The error was:\n"+e.name+": "+e.message);
throw(e); // abort eval
}
try {
window.eval(jsMathstr);
} catch(e) {
alert("jsMath failed to load. The error was:\n"+e.name + ": " + e.message + " on line " + e.lineNumber);
}
jsMath.Setup.inited=0; // allow jsMath.Setup.Body() to run again
// Define wikifers for latex
config.formatterHelpers.mathFormatHelper = function(w) {
var e = document.createElement(this.element);
e.className = this.className;
var endRegExp = new RegExp(this.terminator, "mg");
endRegExp.lastIndex = w.matchStart+w.matchLength;
var matched = endRegExp.exec(w.source);
if(matched) {
var txt = w.source.substr(w.matchStart+w.matchLength,
matched.index-w.matchStart-w.matchLength);
if(this.keepdelim) {
txt = w.source.substr(w.matchStart, matched.index+matched[0].length-w.matchStart);
}
e.appendChild(document.createTextNode(txt));
w.output.appendChild(e);
w.nextMatch = endRegExp.lastIndex;
}
}
config.formatters.push({
name: "displayMath1",
match: "\\\$\\\$",
terminator: "\\\$\\\$\\n?", // 2.0 compatability
termRegExp: "\\\$\\\$\\n?",
element: "div",
className: "math",
handler: config.formatterHelpers.mathFormatHelper
});
config.formatters.push({
name: "inlineMath1",
match: "\\\$",
terminator: "\\\$", // 2.0 compatability
termRegExp: "\\\$",
element: "span",
className: "math",
handler: config.formatterHelpers.mathFormatHelper
});
var backslashformatters = new Array(0);
backslashformatters.push({
name: "inlineMath2",
match: "\\\\\\\(",
terminator: "\\\\\\\)", // 2.0 compatability
termRegExp: "\\\\\\\)",
element: "span",
className: "math",
handler: config.formatterHelpers.mathFormatHelper
});
backslashformatters.push({
name: "displayMath2",
match: "\\\\\\\[",
terminator: "\\\\\\\]\\n?", // 2.0 compatability
termRegExp: "\\\\\\\]\\n?",
element: "div",
className: "math",
handler: config.formatterHelpers.mathFormatHelper
});
backslashformatters.push({
name: "displayMath3",
match: "\\\\begin\\{equation\\}",
terminator: "\\\\end\\{equation\\}\\n?", // 2.0 compatability
termRegExp: "\\\\end\\{equation\\}\\n?",
element: "div",
className: "math",
handler: config.formatterHelpers.mathFormatHelper
});
// These can be nested. e.g. \begin{equation} \begin{array}{ccc} \begin{array}{ccc} ...
backslashformatters.push({
name: "displayMath4",
match: "\\\\begin\\{eqnarray\\}",
terminator: "\\\\end\\{eqnarray\\}\\n?", // 2.0 compatability
termRegExp: "\\\\end\\{eqnarray\\}\\n?",
element: "div",
className: "math",
keepdelim: true,
handler: config.formatterHelpers.mathFormatHelper
});
// The escape must come between backslash formatters and regular ones.
// So any latex-like \commands must be added to the beginning of
// backslashformatters here.
backslashformatters.push({
name: "escape",
match: "\\\\.",
handler: function(w) {
w.output.appendChild(document.createTextNode(w.source.substr(w.matchStart+1,1)));
w.nextMatch = w.matchStart+2;
}
});
config.formatters=backslashformatters.concat(config.formatters);
window.wikify = function(source,output,highlightRegExp,tiddler)
{
if(source && source != "") {
if(version.major == 2 && version.minor > 0) {
var wikifier = new Wikifier(source,getParser(tiddler),highlightRegExp,tiddler);
wikifier.subWikifyUnterm(output);
} else {
var wikifier = new Wikifier(source,formatter,highlightRegExp,tiddler);
wikifier.subWikify(output,null);
}
jsMath.ProcessBeforeShowing();
}
}
//}}}
__''Problem''__
Given a general representation of a family of plans (e.g., a POP), how can we derive an executive policy that takes complex preferences into account?
Examples:
* Execute an action that is believed to be closest to the goal. (motivation: get to the goal faster -- this is the current use)
* Execute an action that hasn't been used in a while, but is valid for our current state. (motivation: decay actions if they keep failing us)
* Execute an action that satisfies some arbitrary preference criteria that ranks actions. (motivation: this would allow for any arbitrary (possibly dynamic) preference to be placed on the actions our dispatcher chooses)
__''Solution''__
Instead of an OADD, use a new data structure for the policy that allows for multiple actions to be returned (e.g., the successor generator graphs found in the fast downward planning system). This moves the deliberation of "which action is best" from the construction of the policy to the evaluation of it. Once evaluated on a state, a set of actions (and associated information like distance to goal) is returned. The best candidate can then be chosen from this set.
__''Why it will work''__
There are a number of advantages to this. A few worth pointing out are as follows:
# By moving the comparison of which action is better to a later phase, the relative size of the policy can be greatly reduced.
# The preference criteria can be arbitrarily complex, and even dynamic (i.e., previous action executions can play a role in what action is selected next)
# Merging new policies into an existing one (e.g., for [[policy repair|Repairing a Failed Policy]]) becomes extremely easy. This isn't true of the partial policy represented as an OADD.
__''How it will be evaluated''__
The three points listed above can be evaluated individually:
# Compare the size of the OADD versus the size of the successor generator (or whatever representation is chosen)
# Qualitatively demonstrate how the policy can be used to execute plans where certain actions fail, or we want to change the preference over action execution in an online fashion.
# Demonstrate the infeasibility of merging OADD policies when compared to what a richer form can do.
__''Problem''__
In our [[IJCAI paper|POP Executer]], when a bottom node is returned from the policy, there is no linearization suffix of the POP that will get us to the goal. In such cases we must replan, but how should we best do this in order to minimize the time taken for replanning (or minimize the overall time for reaching the goal)?
__''Solution''__
The partial policy represents a set of partial states in which we have knowledge of how to reach the goal. Rather than starting from scratch (i.e., planning for the goal from the current state of the world), we can leverage the partial policy to make the task easier. If we //do not// care about the quality of the plan (only that we get "back on track" and continue executing), then we can plan with a heuristic that steers us towards one of the partial states covered by our policy. If we //do// care about the quality of the plan, then we can replan for the original goal while monitoring the policy to see if we reach a state covered by one of the partial states. Storing the distance-to-goal in the policy will allow us to decide if we've found a solution that is good enough (comparing the admissible heuristic to goal (lower bound) with the policy's distance to goal (upper bound)), or if we should continue the replanning process.
When the replanning is complete, the old policy can be updated with the new information (obtained from the new path found in replanning). This may be difficult with the policy represented as an OADD, but some of the ideas found in the [[Preference-based Policies]] could be used to good effect here.
__''Why it will work''__
Re-planning from scratch is a prohibitive process, and this is affirmed by publications of Fritz. Cutting down the time needed for replanning will make the system more robust in the face of changes to the world. The overhead introduced for checking the policy during planning is extremely minimal (about the same as computing what actions are applicable), so there is little chance that the re-planning with the policy will be worse off. Further, changes in the world are typically minor, and this would indicate that any new plan will be quite similar to a previously found one -- leveraging the plan already found will be extremely helpful in such cases.
__''How it will be evaluated''__
Self-analysis: replanning without the partial policy information will be compared to replanning with it. The domains used will likely need to be tailored to have reasonable dynamics (having noticed the degenerative cases that arise when arbitrary fluents are permitted to become false or true). There is also the potential of embedding this framework into ~FF-replan and treat the online execution of the planner in a stochastic world as an execution monitoring task with our machinery driving the planner.
Encrypted(15487E453734D9BC156E64E54555448D51233356)
a43d3f3e5a7e9935b275ac60a4d862ae3594c8e7103fe04f21333321602a39488b
5d3387cdbefc3b6a3e8ca84e3dc0527d36eb2c4cad126b795b9f4f16e7ac4bd1
d02f292e7f56a3213130219ab3f080a35e7cc64cb7dd6b156203d43971742504
833da5d43295a721333921dec0a2e1f45fa54bcbd471805eeebe93bb9e89d82f
32a99ea22c377603b6d9a49a21333421ca236e7bf89e062131302167b1035a4d
84130168f72bdf045aafaa96405982f82f2515cb3c7b49f4732b8b5107480389
6953c483ccf664fb01f2126fdcff28f9ec1bd1811eff30a6942bd28a71937252
1e1d83b6d94371b8c352769a570f
personal research notes and project ideas
The general idea here is to take an ordered traversal of the entire tree and build a skip list structure on top of the list. The edges of the skip list at every level would contain the types seen in the nodes below it. There are a number of variations depending on if links between nodes of the same type are used, and how the information is stored on the edges.
For more information, refer to the paper [[[here]| http://www.haz.ca/docs/papers/order-linked-lists.pdf ]].
|>|>|>|>|!Skip List Covering|
| ''Variation'' | ''Space'' | ''Lookup'' | ''Insert'' | ''Delete'' |
| //Bit Vector//<br> //Type Links// | $O(n\log k)$ | $O(\log n_s + r)$ | $O(k\cdot\log\frac{n}{k} + k + k_s \cdot \log n)$ | $O(k\cdot\log\frac{n}{k} + k + k \cdot \log n)$ |
| //Hash Table//<br> //Type Links// | $O(\frac{n\cdot k}{\log n})$ | $O(\log n_s + r)$ | $O(\log n + k + k_s \cdot \log n)$ | $O(\log n + k + k \cdot \log n)$ |
| //Bit Vector//<br> //No Type Links// | $O(n\log k)$ | $O(\log n_s + r\cdot \log(n_s / r))$ | $O(k\cdot\log\frac{n}{k} + k)$ | $O(k\cdot\log\frac{n}{k} + k)$ |
| //Hash Table//<br> //No Type Links// | $O(\frac{n\cdot k}{\log n})$ | $O(\log n_s + r\cdot \log(n_s / r))$ | $O(\log n + k)$ | $O(\log n + k)$ |
Encrypted(7273829A4983400B3906CA7DCCD14EF12A4298D0)
76f83361e71c213333210f3725fc81168240ad51cc348ba9b9f18ef021313221ff
c1679eb3be94ad8df5c82131322192a56ec16fab86cb213021699cc5b20469ef
f00573ab072cf294581645a22c3eb8cbce172131363021b45fa1cade91867b74
ea772801d26dd171a89d10213334212bb7787e91063d8ebbaf7370809ffbdd48
81213130215aaf8bfdaddc5e4e9d761eb465e182c823c1ac2f672ed6e9213136
302137052e6eb10668ab3821333921595958dd939957635b44a1c786213021f6
0f53139ede572a25409d2302aa800e34538195c3e1213131214eaf7621313630
2140b03698d637c88df69aa3100380e77d0191426b8138e1f1a62e6c5d454b65
d8a4b6bcb518e0ef77e518515521313630216d782133342128f6f3e27be0337c
1a1a92ffc11f0e785c40ac7be21dc8fcc0c5763af3c3f244516529676cc34a38
ec47b0213133213b81a22646bfa7db40d72301b0571e9842770eba4436a75eb0
558dc7a5e8dcdadde275f82c8aae2090bd343f5c3bd7ba6ed7f6fed12a893f5c
078fea752c50e96bdaefb212c1a4babfe8c7e0f9a2ff01bf922da69421313321
21313021aa33b2ff61bc32d96d8310b9fe31267965fc629a3f3057f316bf482b
b92e61546937213333215d7d9938a1a3a82479cfcad853bcf1d6290839c0f928
4ab8cb2131322188db20196b9a2589a7814f1fa71094f80453e61a2efd6588ee
db239461ebf93720adc1c0e21fc2
Encrypted(0A1A2596F637518A173A427C806B90041D0C580C)
4ea8aefd11a7778f1e28eb2b21313630216e1c59258da67004dc1e90a74bffae12
bd8bd475ad945da9956275a1539da121313221fd3e78c28063e13e59cf37b6de
6689b3bb9745d84e8dcfc7a43495ef8f617b12ab7751201b3ce0bd5103745b80
087ad8da84f98f83307215a547826cc056ada47b9420943dd29a011a3a0e1777
5062792139216e599e204778ac7bb1f24271033cc7213021f8b56bc3d68483d9
3ebee1dba33924b7cceee51d575a1eb57e306c9e52c8373553432d2133342146
a8f0333b769a56c4641c735b44599232e0e40533829342c811857343fe609ccb
087a5b9efa90fdab641b94c8163a3d58c066599321313321d8f8b3a232834b4a
7ed421302131c3c49d86591d187f58e9fe738725e27904fa60abd3c32a97d942
f3bef061f0e81988e43c286556ae03c7cf9fc903c5c04f4a6f8ddb896bf77f3b
c7d64175a30fbf6e554926ed7893fac201213136302161059e535bccafb11dcf
ad5a976157aa367d4fdf2131302157a6fa9355867758f431213132210ffb076e
7c2131332181d4e63895ed807c0446718cbede51d953420338e2e4769455d141
79cd44544356119bdd08dc6410b5e1213333216f0e617064254d5495e56f7536
d12133392128bce10275f36b5dbc7452cebc2cda626c9f2131302144213921d9
b6b50ff4a13407a532d7549a6a5770a3937521333921059287bc50743dd66506
b2249c99a7d529ef47b0fb7082e86c5e322131312144213131214331dabbc511
bb53da031920a7d89740436a8bf4448f1a14438e24821fb51c447289b6dd04ed
14471772ccd479ab474956ed5ef785ba376f3c4d76d37c25ef4449192a8b3b6b
47fb4d38f1b03fa982124af093fba78c23d2aaa418a842d635b53d2130218110
a94d1f5a35bfaaf1ae442a7acad1b35db4bf06b1df1d6fca4b21333921517d7c
a15ed03bed90b2ce619e2cb1c8287b213133215468904808fc3c4450975d81e3
6d1bade8d007b303086321313630218835fe58d7fcc8fcc1f28126bf9f7b98f0
61cc86336491fd55e8c7a606b42133342105a2a3213136302175997d65d02131
3021f16656d486f95f2f2d3d7319a631ed57de5b5397819e6edc659640c8c434
25a2dc533ab17903011ac22131363021ab2aea714bee40d4eb801a07c110453e
5a6add5f7078102ce6bdd9d211ecfea767f830bf5aa1fb7280c6b51ea87654bb
14302897a21b06d219bb96213339215021313630214e9c970fb12aec21313321
5a24e5cdc71d21313121f37d98f7d7597357e4ad449a80c3e21414dd9db2f751
3923c4e8f7bf1a4b5d865ae121333421f7675c07487b65dde58a4f9d1dab6f98
57d5df8645a52bb221313321caa95b34c87595896472fbbb6e18176951facbd7
7db0058e45d02fbd60b08cb9fcbfbb4432ebebdf81cd07eba24728be416dd194
367c2c8e83c14f69d1bc96f4b3ff6f334587bca1d704fbaccf61a68c21333321
6c267b871df88dc3b04da7745e213133213979e01f08b68329486bf3ff89af8f
9d18bdef4207b77172aae6e2fe1b9da8da814bb63021333921dc286e3001fa9e
ae407dc75e1c52877186904ae5e897192c16afba30f5952df640f290e1213133
21cae9bdeb21333421eb8aaad0213334212d5721313121a904ab17233716b0f6
f113c5d8886fd3c975078454ac89a3cfc47de4d8011b6abcd819968d8958fbd3
55bab6e45831fb21333321373abedd617b16f7b4b761abe59d7308b3cc7fa101
b4213334216ec2f9a88908b52c52ca312f08962a6df7832b667dc83deaf65f21
333921f15dc3c7376b731310881619f772d867de32ad33e7ef7ae514d9213921
32d2d8ced8c24a08c1bc517d0fcec7b285ac80d1eea24435db8f017f7a373e21
39217aee695250516c1c5d6462f05ba2eea858fe6ceed805c0d905d4ff2f9b21
313021e37b3dcced87bfbbda85bf624a05e37c18be65109821313121f8ae28ce
1564072131363021faa7897ad5eb45ef26ddac1f5373c2ff213131215434dada
c4ad2c7ed1425b072b5d18b097d539e78120c09f8d4e4fae8c07c21c3f4e9198
2495cbefd3837a86ae1648799087ef8321313630212c6ab63743549b03fc464c
4bce1336236f57a2db3291ec4c18f30e39bdb37b6b8608d9e321333421253221
313321fdb50487423a281c776f1d5887517566e164b8e456d50831213021dbd6
b545cb458f1481a93ecad18166c9cd193647028f9aa198cedba88165c03d7380
21313221ffca7eee962133332149f4c77206531b8011684751cf5e21313321e7
ce45332b8f5b453753923785bb7e2066dfcd88af43fea876f98aa5c313585f30
5f141e14fc16767e1cfd07e2337caceb2131363021d681770e441d58b7ffbe44
28c58ef18a9cc7d3997fae213136302130d24be94502724a80854584d469d8f1
5e4b213132217132d86f596355213130216c8fe7f3ed3e778121333421365ff6
8ec9eeb1ffc002f6e8ae7f39f51eb04d49df8d21313321318e80da47e32319d6
e5f0b7383a3dd83833d31d161f4cf3c1021cab1025a3a1c16778213021f7fbc6
84ac5063ff4fe6c7b3213131217c321721313221e87833ee12e3ca4ac561e237
e320ca6f67f8112131312148699786fed5cc6a530628c149237550f1e167e5f1
da122b6f35d797d85a7c8b65c57075b93b051d44d39d213021ccec6723ed4aa1
7326ac75783db84ec5f19fa6cf7a8225bb86614f1bb883cdf6c058d3dc36e07d
dc3c5f5ddc403182901c37213021587d0481114e7b1a410e2584e64dfc506a37
92522130216f311c7be27ec9d19d13cb1bb6740131c5c4253e613be416572131
302141ab1ac8254dcfd3683ccd9d14f8289b9bf6fc213339216e96d2352d83ce
b36512dc6b185e8c34f50ff0fb9f07b766ac3bcb377613e3d05a2ea42cf54a25
ce165977739f2139216cf492ce18be66fd45a36fb72f505cbf8f3453444c311c
99bb8c03fa5ddd99dd42b8edf023f737ecc5f361ff14383341f1213334216d53
515c9464f306f181a9b4dd03ca4086c24956ae4050aa5e717c6e55520f486dc0
1de7bfb62405359bbbee35a71964c9dc6b35a9799d689e136ec3a7fa30b6485b
c0213136302110699a7b15794d1bbab79b17bb53a6ba0f296b786f28
/***
http://tiddlystyles.com/#theme:DevFire
Author: Clint Checketts
***/
/*{{{*/
body {
background: #000;
}
/*}}}*/
/***
!Link styles /% ============================================================= %/
***/
/*{{{*/
a,
a.button,
#mainMenu a.button,
#sidebarOptions .sliderPanel a{
color: #ffbf00;
border: 0;
background: transparent;
}
a:hover,
a.button:hover,
#mainMenu a.button:hover,
#sidebarOptions .sliderPanel a:hover
#sidebarOptions .sliderPanel a:active{
color: #ff7f00;
border: 0;
border-bottom: #ff7f00 1px dashed;
background: transparent;
text-decoration: none;
}
#displayArea .button.highlight{
color: #ffbf00;
background: #4c4c4c;
}
/*}}}*/
/***
!Header styles /% ============================================================= %/
***/
/*{{{*/
.header{
border-bottom: 2px solid #ffbf00;
color: #fff;
}
.headerForeground a {
color: #fff;
}
.header a:hover {
border-bottom: 1px dashed #fff;
}
/*}}}*/
/***
!Main menu styles /% ============================================================= %/
***/
/*{{{*/
#mainMenu {color: #fff;}
#mainMenu h1{
font-size: 1.1em;
}
#mainMenu li,#mainMenu ul{
list-style: none;
margin: 0;
padding: 0;
}
/*}}}*/
/***
!Sidebar styles /% ============================================================= %/
***/
/*{{{*/
#sidebar {
right: 0;
color: #fff;
border: 2px solid #ffbf00;
border-width: 0 0 2px 2px;
}
#sidebarOptions {
background-color: #4c4c4c;
padding: 0;
}
#sidebarOptions a{
margin: 0;
color: #ffbf00;
border: 0;
}
#sidebarOptions a:hover {
color: #4c4c4c;
background-color: #ffbf00;
}
#sidebarOptions a:active {
color: #ffbf00;
background-color: transparent;
}
#sidebarOptions .sliderPanel {
background-color: #333;
margin: 0;
}
#sidebarTabs {background-color: #4c4c4c;}
#sidebarTabs .tabSelected {
padding: 3px 3px;
cursor: default;
color: #ffbf00;
background-color: #666;
}
#sidebarTabs .tabUnselected {
color: #ffbf00;
background-color: #5f5f5f;
padding: 0 4px;
}
#sidebarTabs .tabUnselected:hover,
#sidebarTabs .tabContents {
background-color: #666;
}
.listTitle{color: #FFF;}
#sidebarTabs .tabContents a{
color: #ffbf00;
}
#sidebarTabs .tabContents a:hover{
color: #ff7f00;
background: transparent;
}
#sidebarTabs .txtMoreTab .tabSelected,
#sidebarTabs .txtMoreTab .tab:hover,
#sidebarTabs .txtMoreTab .tabContents{
color: #ffbf00;
background: #4c4c4c;
}
#sidebarTabs .txtMoreTab .tabUnselected {
color: #ffbf00;
background: #5f5f5f;
}
.tab.tabSelected, .tab.tabSelected:hover{color: #ffbf00; border: 0; background-color: #4c4c4c;cursor:default;}
.tab.tabUnselected {background-color: #666;}
.tab.tabUnselected:hover{color:#ffbf00; border: 0;background-color: #4c4c4c;}
.tabContents {
background-color: #4c4c4c;
border: 0;
}
.tabContents .tabContents{background: #666;}
.tabContents .tabSelected{background: #666;}
.tabContents .tabUnselected{background: #5f5f5f;}
.tabContents .tab:hover{background: #666;}
/*}}}*/
/***
!Message area styles /% ============================================================= %/
***/
/*{{{*/
#messageArea {background-color: #666; color: #fff; border: 2px solid #ffbf00;}
#messageArea a:link, #messageArea a:visited {color: #ffbf00; text-decoration:none;}
#messageArea a:hover {color: #ff7f00;}
#messageArea a:active {color: #ff7f00;}
#messageArea .messageToolbar a{
border: 1px solid #ffbf00;
background: #4c4c4c;
}
/*}}}*/
/***
!Popup styles /% ============================================================= %/
***/
/*{{{*/
.popup {color: #fff; background-color: #4c4c4c; border: 1px solid #ffbf00;}
.popup li.disabled{color: #fff;}
.popup a {color: #ffbf00; }
.popup a:hover { background: transparent; color: #ff7f00; border: 0;}
.popup hr {color: #ffbf00; background: #ffbf00;}
/*}}}*/
/***
!Tiddler Display styles /% ============================================================= %/
***/
/*{{{*/
.title{color: #fff;}
h1, h2, h3, h4, h5 {
color: #fff;
background-color: transparent;
border-bottom: 1px solid #333;
}
.subtitle{
color: #666;
}
.viewer {
line-height: 125%;
font-family: serif;
font-size: 12pt;
color: #fff;
}
.viewer table{background: #666; color: #fff;}
.viewer th {background-color: #996; color: #fff;}
.viewer pre, .viewer code {color: #ddd; background-color: #4c4c4c; border: 1px solid #ffbf00;}
.viewer hr {color: #666;}
.tiddler .button {color: #4c4c4c;}
.tiddler .button:hover { color: #ffbf00; background-color: #4c4c4c;}
.tiddler .button:active {color: #ffbf00; background-color: #4c4c4c;}
.toolbar {
color: #4c4c4c;
}
.toolbar a.button,
.toolbar a.button:hover,
.toolbar a.button:active,
.editorFooter a{
border: 0;
}
.footer {
color: #ddd;
}
.selected .footer {
color: #888;
}
.highlight, .marked {
color: #000;
background-color: #ffe72f;
}
.editorFooter {
color: #aaa;
}
.tab{
-moz-border-radius-topleft: 3px;
-moz-border-radius-topright: 3px;
}
.tagging,
.tagged{
background: #4c4c4c;
border: 1px solid #4c4c4c;
}
.selected .tagging,
.selected .tagged{
background-color: #333;
border: 1px solid #ffbf00;
}
.tagging .listTitle,
.tagged .listTitle{
color: #fff;
}
.tagging .button,
.tagged .button{
color: #ffbf00;
border: 0;
padding: 0;
}
.tagging .button:hover,
.tagged .button:hover{
background: transparent;
}
.selected .isTag .tagging.simple,
.selected .tagged.simple,
.isTag .tagging.simple,
.tagged.simple {
float: none;
display: inline;
border: 0;
background: transparent;
color: #fff;
margin: 0;
}
.cascade {
background: #4c4c4c;
color: #ddd;
border: 1px solid #ffbf00;
}
.justifyright {
text-align: right;
}
/*}}}*/
__''Problem''__
Given a POP with simple temporal constraints added (i.e., an STP with causal links), how can we effectively execute the plan in the face of a changing world?
__''Solution''__
Following the model of our IJCAI work, and previous dispatchability research, we first compile the minimal form of temporal constraints by treating the network simply as an STP. We then build the formula-action pairs using the original algorithm, but following only the linearizations allowed by the temporal constraints. When one action of a temporal constraint is executed, so must the other one. Because of this, we would introduce a fluent for every temporal constraint to ensure the pairs of actions are both executed. The partial policy must be augmented to take into account inner nodes of the form "has //t// time passed since action //a// was executed", and leaf nodes of the form "wait //t// time, and then execute //a//". Because of this, the dispatcher must also keep track of a time counter, and the timing of recently executed actions.
__''Why it will work''__
The theory has been worked out on paper, and for the simple temporal constraints that have a lower bound $\geq$ 0 the problem of compiling the dispatching task to a policy is not significantly harder. If any complexity is added, it will be in a number of linearizations now having unique regressions due to the temporal fluents we must add to the domain (this causes more formula-action pairs to be created, and thus a larger policy). On the other hand, the temporal constraints may significantly reduce the number of permitted linearizations (and thus the size of the policy). The underlying solution works because we are able to implicitly enumerate every trace of the network, just as we did with the POP.
__''How it will be evaluated''__
The relative size of the policy will be compared to the policy for just the POP (ignoring temporal restrictions). The effectiveness of the EM system can be evaluated analytically as we have done previously, since a single linearization of the temporal POP can be placed into a policy. This will be somewhat of an approximation since the temporal range isn't considered in the state count (only whether certain temporal inequalities hold).
Encrypted(04BB1487F7C9D2C0CE9595F38CE81E5C83900282)
f9264dc8e3931e9e73a183cbf0249202a73d287a953ad065fd526f7df4996f519e
387d60b04baaba60e7b71520213021e5a36268ed1e31669a5eab2c354507ed5f
56bd5f5b6b86455811aba3323c4f5550022d43e246bfec1418f9edbb077e2f1b
653e7321313121c9a85f2c6ca6537e2133342142648b52f0aa8fbab28a213333
2111b3af4554117880847480fdc6fc64c2468d266664848afa21313021df7721
30216d0214e68813fe0526a821313221b6422133392149ad015f9aaab3ebbdb3
12259453bb213334211b33213334213bd66a7b9921333421308ec33adb706caf
192a8b5bdb37ea7187c311814e01dc0ff7cb14714ad796083266b2cd9ff3e484
8b64c2a39c105840c821313221c361d4289b1821313630219138ebac5158debb
2131363021ce12962133332124dee53577cf21313321edd6875bcdb7e35acfa4
a598b184d9a2ce78c10e6b7fa2f8d898ce8b54b25cf4ece8037803b5a3213021
cdba97a66b1a2131302196a5052965dfe00157401df326c51983a191fdac2131
3221864cb393d6c864caf3d59fd0ac84173ba635717192c886c3f5c5535bd892
c27c50f1c15a08fbbe9b2d7668608fe07f1c7e635b89c4e9c4c239db7cef839b
fb2139217f77c9a4123c118d7e4284cdb42bf262fa45ef0f8b260ecd61c774ab
3ee73602879d7376e573a65ab944a1d66fb5eb81f39f9a8d674a4894f40fab06
c1e2514bcc4421313630213cbf21313021b29c63dad52fc5988db915b04704df
fa9767521741f64bc8f5dd2c66a164fd6074c14a9e3301b0df3694237fb7361f
c31bcc39d3051ea7da57c0d381b1389b21313630214e4a6193847b75a7144571
74eb9f44f2abe2b7424039dabd6a822e7e67d99dd036d9b3cec081569dad3c71
978c6f54f6ad66213333212ceda6cb184621302195b3c5e315cf1b0fd9f93b21
33332143785c213131216cdeb221302121313630212131332121333421699f54
6e1c38cf91f0651765456c250f14b84914b6bcc51f5d47938e655a2131363021
0217cf8deb2d30213921b9f87a317c6651b75ca5aa2131363021d17442d18bc6
5fe264b75445fa33066cfe5b213333218f93aaac4b3c7da769ea3107e9cdac82
7ca5764621313321c810d96b1853c72dc99b3803d88d19abe03af84aae88738b
88aa8d7647248f9a85465bdea11ebe9e1444873e0674ac74cfb5c7247f17cb7e
de8173962be0de76ec35327564133fa19ee6de05a8b4d7205e2131302133a53f
6346d52d7a12f42133332108a3e8bab097795204fea55ba1213334219bb5fbb2
e028eeb5a58d7f49bc92213130219ce37f655a519be4d0d98f9e3c48ecdffa21
313321e8d3c9da89391c7a3803593ed80f43d547f6c6abf46554f2fe1e213130
21e48c6d7754cf7c938544f3ac037285398c52a2cdd7cd99cbbe1eb354804206
9f5e702130219ebfedf71f32b6afdc5d6b230f49c48952e5bbb6b0d40642ba02
7d598d13b6186762325f4b64f21cbf949db367ce8787057b1147251572736a11
742cc97c21313221b92131312119f726ec50e59305c91b28eab3ca5560c08ae8
632acf3ec2c1aea5fbab47f24fac04e0c80868a6c19595434f39a36eaa4799a7
553c403c8619d0bcd6bea93b9dce9e52ca21333321da44aa34b3692dbaef6116
fb7af93ee10e6645608e20d45ad0ee0fa366de6221313221a40189c67e6cc2de
b7654408f82c19b45fe7d06ca96dda7aeac28e145d726d0f59fa77a104ee7ddd
eea26f5b6cc08a17baac03c0956d3571d5c8f164031825f0e6b3dcc8af47bc33
1369544f2d96b5e23337e1bc100428763b2e87927caadc026bb786b520704b8b
aad8aaf94214d77a82819b1453c7da76fe47823d808c323f380249876173d5e2
65e8c9fcab1b24656ec625b9507b39d0e22c017324c320950e1a7cc5aef96ec2
361e288833d9a2be674787b1c4c2597612349f5bd7f71a24f9d6e710a8213136
3021906cdcddf4f4e3ea393e5008babc551c2a3de51d39d7a96c213130212130
21016e6b63e09bde2cc5ac21313630212dc28e7d24a6479a34dce8c0b68b4dfa
4684368119ab327f3cef6c8c8ea12130218cefab9ad52133332160fcc3325b8c
17955b068e13faf244de6e476bd0b7525f8930362978caceeb735b251b9b6197
1da5e8f7bf1f34ba2cd81d8c971488c7d8b3178e776bf95ce44ec1b8e7
/***
|Name|TiddlerEncryptionPlugin|
|Author|Lyall Pearce|
|Source|http://www.Remotely-Helpful.com/TiddlyWiki/TiddlerEncryptionPlugin.html|
|License|[[Creative Commons Attribution-Share Alike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|
|Version|3.2.1|
|~CoreVersion|2.4.0|
|Requires|None|
|Overrides|store.getSaver().externalizeTiddler(), store.getTiddler() and store.getTiddlerText()|
|Description|Encrypt/Decrypt Tiddlers with a Password key|
!!!!!Usage
<<<
* Tag a tiddler with Encrypt(prompt)
** Consider the 'prompt' something to help you remember the password with. If multiple tiddlers can be encrypted with the same 'prompt' and you will only be asked for the password once.
* Upon save, the Tiddler will be encrypted and the tag replaced with Decrypt(prompt).
** Failure to encrypt (by not entering a password) will leave the tiddler unencrypted and will leave the Encrypt(prompt) tag in place. This means that the next time you save, you will be asked for the password again.
** To have multiple tiddlers use the same password - simply use the same 'prompt'.
** Tiddlers that are encrypted may be automatically tagged 'excludeSearch' as there is no point in searching encrypted data - this is configurable by an option - you still may want to search the titles of encrypted tiddlers
** Tiddlers that are encrypted may be automatically tagged 'excludeLists', if you have them encrypted, you may also want to keep them 'hidden' - this is configurable by an option.
** Automatic removal of excludeLists and excludeSearch tags is performed, if the above two options are set, only if these two tags are the last 2 tags for a tiddler, if they are positioned somewhere else in the tags list, they will be left in place, meaning that the decrypted tiddler will not be searchable and/or will not appear in lists.
** Encrypted tiddlers are stored as displayable hex, to keep things visibly tidy, should you display an encrypted tiddler. There is nothing worse than seeing a pile of gobbledy gook on your screen. Additionally, the encrypted data is easily cut/paste/emailed if displayed in hex form.
* Tiddlers are decrypted only if you click the decrypt button or the decryptAll button, not when you load the TiddlyWiki
** If you don't display a tiddler, you won't have the option to decrypt it (unless you use the {{{<<EncryptionDecryptAll>>}}} macro)
** Tiddlers will re-encrypt automatically on save.
** Decryption of Tiddlers does not make your TiddlyWiki 'dirty' - you will not be asked to save if you leave the page.
* Errors are reported via diagnostic messages.
** Empty passwords, on save, will result in the tiddler being saved unencrypted - this should only occur with new tiddlers, decrypted tiddlers or with tiddlers who have had their 'prompt' tag changed.
** Encrypted tiddlers know if they are decrypted successfully - failure to decrypt a tiddler will ''not'' lose your data.
** Editing of an encrypted (that has not been unencrypted) tiddler will result in loss of that tiddler as the SHA1 checksums will no longer match, upon decryption. To this end, it is best that you do not check the option. You can, however edit an encrypted tiddler tag list - just do ''not'' change the tiddler contents.
** To change the password on a Tiddler, change the Encrypt('prompt') tag to a new prompt value, after decrypting the tiddler.
** You can edit the tags of an encrypted tiddler, so long as you do not edit the text.
** To change the password for all tiddlers of a particular prompt, use the {{{<<EncryptionChangePassword ["button text" ["tooltip text" ["prompt string" ["accessKey"]]]]>>}}} macro.
** To decrypt all tiddlers of a particular "prompt string", use the {{{<<EncryptionDecryptAll ["button text" ["tooltip text" ["prompt string" ["accessKey"]]]]>>}}} macro - this will make tiddlers encrypted with "prompt string" searchable - or prompt for all 'prompt strings', if none is supplied.
<<<
!!!!!Configuration
<<<
Useful Buttons:
<<EncryptionChangePassword>> - Change passwords of encrypted tiddlers.
<<EncryptionDecryptAll>> - Decrypt ALL tiddlers - enables searching contents of encrypted tiddlers.
<<option chkExcludeEncryptedFromSearch>> - If set, Encrypted Tiddlers are excluded from searching by tagging with excludeSearch. If Clear, excludeSearch is not added and it is also removed from existing Encrypted Tiddlers only if it is the last Tag. Searching of Encrypted Tiddlers is only meaningful for the Title and Tags.
<<option chkExcludeEncryptedFromLists>> - If set, Encrypted Tiddlers are excluded from lists by tagging with excludeLists. If Clear, excludeLists is not added and it is also removed from existing Encrypted Tiddlers only if it is the last Tag. Preventing encrypted tiddlers from appearing in lists effectively hides them.
<<option chkShowDecryptButtonInContent>> - If set, Encrypted Tiddlers content is replaced by <<EncryptionDecryptThis>> button. This has consequences, in the current version as, if you edit the tiddler without decrypting it, you lose the contents.
<<<
!!!!!Revision History
<<<
* 3.2.1 - Returned the <<EncryptionDecryptThis>> button as an option.
* 3.2.0 - Ditched the 'Decrypt' button showing up in the tiddler contents if the tiddler is encrypted. It caused too much pain if you edit the tiddler without decrypting it - you lost your data as it was replaced by a Decrypt Macro call! Additionally, a 'decrypt' button will now appear in the toolbar, just before the edit button, if the tiddler is encrypted. This button only appears if using core TiddlyWiki version 2.4 or above.
* 3.1.1 - Obscure bug whereby if an encrypted tiddler was a certain length, it would refuse to decrypt.
* 3.1.0 - When creating a new Encrypt(prompt) tiddler and you have not previously decrypted a tiddler with the same prompt, on save, you will be prompted for the password to encrypt the tiddler. Prior to encrypting, an attempt to decrypt all other tiddlers with the same prompt, is performed. If any tiddler fails to decrypt, the save is aborted - this is so you don't accidentally have 2 (or more!) passwords for the same prompt. Either you enter the correct password, change the prompt string and try re-saving or you cancel (and the tiddler is saved unencrypted).
* 3.0.1 - Allow Enter to be used for password entry, rather than having to press the OK button.
* 3.0.0 - Major revamp internally to support entry of passwords using forms such that passwords are no longer visible on entry. Completely backward compatible with old encrypted tiddlers. No more using the javascript prompt() function.
<<<
!!!!!Additional work
***/
//{{{
version.extensions.TiddlerEncryptionPlugin = {major: 3, minor: 2, revision: 1, date: new Date(2008,10,26)};
// where I cache the passwords - for want of a better place.
config.encryptionPasswords = new Array();
config.encryptionReEnterPasswords = false;
if(config.options.chkExcludeEncryptedFromSearch == undefined) config.options.chkExcludeEncryptedFromSearch = false;
if(config.options.chkExcludeEncryptedFromLists == undefined) config.options.chkExcludeEncryptedFromLists = false;
if(config.options.chkShowDecryptButtonInContent == undefined) config.options.chkShowDecryptButtonInContent = false;
config.macros.EncryptionChangePassword = {};
config.macros.EncryptionChangePassword.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
var theButton = createTiddlyButton(place,
(params[0] && params[0].length > 0) ? params[0] : "Change Passwords",
(params[1] && params[1].length > 0) ? params[1] : "Change Passwords" + (params[2] ? " for prompt "+params[2] : ""),
onClickEncryptionChangePassword,
null,
null,
params[3]);
if(params[2] && params[2].length > 0) {
theButton.setAttribute("promptString", params[2]);
}
};
config.macros.EncryptionDecryptAll = {};
config.macros.EncryptionDecryptAll.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
var theButton = createTiddlyButton(place,
(params[0] && params[0].length > 0) ? params[0] : "Decrypt All",
(params[1] && params[1].length > 0) ? params[1] : "Decrypt All Tiddlers" + ((params[2] && params[2].length > 0) ? " for prompt "+params[2] : " for a given 'prompt string'"),
onClickEncryptionDecryptAll,
null,
null,
params[3]);
if(params[2] && params[2].length > 0) {
theButton.setAttribute("promptString", params[2]);
}
};
config.macros.EncryptionDecryptThis = {};
config.macros.EncryptionDecryptThis.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
var theButton = createTiddlyButton(place,
(params[0] && params[0].length > 0) ? params[0] : "Decrypt",
(params[1] && params[1].length > 0) ? params[1] : "Decrypt this Tiddler",
onClickEncryptionDecryptThis,
null,
null,
params[3]);
if(params[2] && params[2].length > 0) {
theButton.setAttribute("theTiddler", params[2]);
}
};
// toolbar button to decrypt tiddlers.
config.commands.decryptThis = {
text: "decrypt",
tooltip: "Decrypt this tiddler",
isEnabled : function(tiddler) {
// Only show decrypt button if tiddler is tagged as Decrypt(
if(tiddler.tags.join().indexOf('Decrypt(') == -1) {
return false;
} else {
return true;
}
},
handler: function(event, src, title) {
encryptionGetAndDecryptTiddler(title);
return false;
}
};
// core version 2.4 or above get a 'decrypt' button in the toolbar.
if(config.shadowTiddlers && config.shadowTiddlers.ToolbarCommands && config.shadowTiddlers.ToolbarCommands.indexOf('decryptThis') == -1) {
// put our toolbar button in before the edit button.
// won't work if editTiddler is not the default item (prefixed with plus)
config.shadowTiddlers.ToolbarCommands.replace(/\+editTiddler/,'decryptThis +editTiddler');
}
// Called by the EncryptionChangePassword macro/button
// Also invoked by the callback for password entry
function onClickEncryptionChangePassword(eventObject) {
var promptString;
if(!promptString && this.getAttribute) {
promptString = this.getAttribute("promptString");
}
// I do call this function directly
if(!promptString && typeof(eventObject) == "string") {
promptString = eventObject;
}
if(!promptString) {
promptString = prompt("Enter 'prompt string' to change password for:","");
}
if(!promptString) {
return;
}
if(! config.encryptionPasswords[promptString]) {
var changePasswordContext = {changePasswordPromptString: promptString,
callbackFunction: MyChangePasswordPromptCallback_TiddlerEncryptionPlugin};
MyPrompt_TiddlerEncryptionPlugin(promptString,"",changePasswordContext);
return;
// Callback function will re-invoke this function
}
// Decrypt ALL tiddlers for that prompt
onClickEncryptionDecryptAll(promptString);
// Now ditch the cached password, this will force the re-request for the new password, on save.
displayMessage("Save TiddlyWiki to set new password for '"+promptString+"'");
config.encryptionPasswords[promptString] = null;
// mark store as dirty so a save will be requrested.
store.setDirty(true);
autoSaveChanges();
return;
};
// Called by the password entry form when the user clicks 'OK' button.
function MyChangePasswordPromptCallback_TiddlerEncryptionPlugin(context) {
config.encryptionPasswords[context.passwordPrompt] = context.password;
onClickEncryptionChangePassword(context.changePasswordPromptString);
return;
}
// Called by the EncryptionDecryptThis macro/button
function onClickEncryptionDecryptThis() {
var theTiddler = this.getAttribute("theTiddler");
if(!theTiddler) {
return;
}
encryptionGetAndDecryptTiddler(theTiddler);
return;
};
function encryptionGetAndDecryptTiddler(title) {
config.encryptionReEnterPasswords = true;
try {
theTiddler = store.getTiddler(title);
config.encryptionReEnterPasswords = false;
story.refreshAllTiddlers();
} catch (e) {
if(e == "DecryptionFailed") {
displayMessage("Decryption failed");
return;
}
} // catch
return;
};
// called by the EncryptionDecryptAlll macro/button
// Also called by the callback after the user clicks 'OK' button on the password entry form
function onClickEncryptionDecryptAll(eventObject) {
var promptString;
if(!promptString && this.getAttribute) {
promptString = this.getAttribute("promptString");
}
// I do call this function directly
if(!promptString && typeof(eventObject) == "string") {
promptString = eventObject;
}
if(!promptString) {
promptString = "";
}
// Loop through all tiddlers, looking to see if there are any Decrypt(promptString) tagged tiddlers
// If there are, check to see if their password has been cached.
// If not, ask for the first one that is missing, that we find
// the call back function will store that password then invoke this function again,
// which will repeat the whole process. If we find all passwords have been cached
// then we will finally do the decryptAll functionality, which will then
// be able to decrypt all the required tiddlers, without prompting.
// We have to do this whole rigmarole because we are using a 'form' to enter the password
// rather than the 'prompt()' function - which shows the value of the password.
var tagToSearchFor="Decrypt("+promptString;
config.encryptionReEnterPasswords = true;
var promptGenerated = false;
store.forEachTiddler(function(store,tiddler) {
// Note, there is no way to stop the forEachTiddler iterations
if(!promptGenerated && tiddler && tiddler.tags) {
for(var ix=0; ix<tiddler.tags.length && !promptGenerated; ix++) {
if(tiddler.tags[ix].indexOf(tagToSearchFor) == 0) {
var tag = tiddler.tags[ix];
var lastBracket=tag.lastIndexOf(")");
if(lastBracket >= 0) {
// Ok, tagged with Encrypt(passwordPrompt)
// extract the passwordPrompt name
var passwordPromptString=tag.substring(8,lastBracket);
if(!config.encryptionPasswords[passwordPromptString]) {
// no password cached, prompt and cache it, rather than decryptAll
// callback from prompting form will resume decryptAll attempt.
var decryptAllContext = {decryptAllPromptString: promptString,
callbackFunction: MyDecryptAllPromptCallback_TiddlerEncryptionPlugin};
MyPrompt_TiddlerEncryptionPlugin(passwordPromptString,"",decryptAllContext);
promptGenerated = true;
} // if(!config.encryptionPasswords
} // if(lastBracket
} // if(tiddler.tags[ix]..
} // for
} // if
}); // store.forEachTiddler
// If we get here, all passwords have been cached.
if(!promptGenerated) {
config.encryptionReEnterPasswords = false;
// Now do the decrypt all functionality
try {
store.forEachTiddler(function(store,tiddler) {
// Note, there is no way to stop the forEachTiddler iterations
if(tiddler && tiddler.tags) {
for(var ix=0; ix<tiddler.tags.length; ix++) {
if(tiddler.tags[ix].indexOf(tagToSearchFor) == 0) {
try {
CheckTiddlerForDecryption_TiddlerEncryptionPlugin(tiddler);
} catch (e) {
displayMessage("Decryption of '"+tiddler.title+"' failed.");
// throw e;
}
} // if(tiddler.tags
} // for
} // if
}); // store.forEachTiddler
displayMessage("All tiddlers" + (promptString != "" ? " for '"+promptString+"'" : "") + " have been decrypted");
} catch (e) {
if(e == "DecryptionFailed") {
return;
}
} // catch
}
return;
};
function MyDecryptAllPromptCallback_TiddlerEncryptionPlugin(context) {
config.encryptionPasswords[context.passwordPrompt] = context.password;
// restart the decryptAll process again after the user has entered a password.
onClickEncryptionDecryptAll(context.decryptAllPromptString);
return;
}
saveChanges_TiddlerEncryptionPlugin = saveChanges;
saveChanges = function(onlyIfDirty,tiddlers) {
// Loop through all tiddlers, looking to see if there are any Encrypt(string) tagged tiddlers
// If there are, check to see if their password has been cached.
// If not, ask for the first one that is missing, that we find
// the call back function will store that password then invoke this function again,
// which will repeat the whole process. If we find all passwords have been cached
// then we will finally call the original saveChanges() function, which will then
// be able to save the tiddlers.
// We have to do this whole rigmarole because we are using a 'form' to enter the password
// rather than the 'prompt()' function - which shows the value of the password.
config.encryptionReEnterPasswords = true;
var promptGenerated = false;
store.forEachTiddler(function(store,tiddler) {
if(!promptGenerated && tiddler && tiddler.tags) {
for(var ix=0; ix<tiddler.tags.length && !promptGenerated; ix++) {
if(tiddler.tags[ix].indexOf("Encrypt(") == 0) {
var tag = tiddler.tags[ix];
var lastBracket=tag.lastIndexOf(")");
if(lastBracket >= 0) {
// Ok, tagged with Encrypt(passwordPrompt)
// extract the passwordPrompt name
var passwordPrompt=tag.substring(8,lastBracket);
if(!config.encryptionPasswords[passwordPrompt]) {
// no password cached, prompt and cache it, rather than save
var saveContext = {onlyIfDirty: onlyIfDirty,
tiddlers: tiddlers,
callbackFunction: MySavePromptCallback_TiddlerEncryptionPlugin};
MyPrompt_TiddlerEncryptionPlugin(passwordPrompt,"",saveContext);
promptGenerated = true;
} // if(!config.encryptionPasswords
} // if(lastBracket
} // if(tiddler.tags[ix]..
} // for
} // if
}); // store.forEachTiddler
// If we get here, all passwords have been cached.
if(!promptGenerated) {
config.encryptionReEnterPasswords = false;
saveChanges_TiddlerEncryptionPlugin(onlyIfDirty,tiddlers);
}
return;
}
function MySavePromptCallback_TiddlerEncryptionPlugin(context) {
config.encryptionPasswords[context.passwordPrompt] = context.password;
// validate the password entered by attempting to decrypt all tiddlers
// with the same encryption prompt string.
onClickEncryptionDecryptAll(context.passwordPrompt);
// restart the save process again
saveChanges(context.onlyIfDirty, context.tiddlers);
return;
}
store.getSaver().externalizeTiddler_TiddlerEncryptionPlugin = store.getSaver().externalizeTiddler;
store.getSaver().externalizeTiddler = function(store, tiddler) {
// Ok, got the tiddler, track down the passwordPrompt in the tags.
// track down the Encrypt(passwordPrompt) tag
if(tiddler && tiddler.tags) {
for(var g=0; g<tiddler.tags.length; g++) {
var tag = tiddler.tags[g];
if(tag.indexOf("Encrypt(") == 0) {
var lastBracket=tag.lastIndexOf(")");
if(lastBracket >= 0) {
// Ok, tagged with Encrypt(passwordPrompt)
// extract the passwordPrompt name
var passwordPrompt=tag.substring(8,lastBracket);
// Ok, Encrypt this tiddler!
var decryptedSHA1 = Crypto.hexSha1Str(tiddler.text);
var password = GetAndSetPasswordForPrompt_TiddlerEncryptionPlugin(passwordPrompt);
if(password) {
var encryptedText = TEAencrypt(tiddler.text, password);
encryptedText = StringToHext_TiddlerEncryptionPlugin(encryptedText);
tiddler.text = "Encrypted("+decryptedSHA1+")\n"+encryptedText;
// Replace the Tag with the Decrypt() tag
tiddler.tags[g]="Decrypt("+passwordPrompt+")";
// let the store know it's dirty
store.setDirty(tiddler.title, true);
// prevent searches on encrypted tiddlers, still nice to search on title though.
if(config.options.chkExcludeEncryptedFromSearch == true) {
tiddler.tags.push("excludeSearch");
}
// prevent lists of encrypted tiddlers
if(config.options.chkExcludeEncryptedFromLists == true) {
tiddler.tags.push("excludeLists");
}
} else {
// do not encrypt - no password entered
}
break;
} // if (lastBracket...
} // if(tag.indexOf(...
} // for(var g=0;...
} // if(tiddler.tags...
// Then, finally, do the save by calling the function we override.
return store.getSaver().externalizeTiddler_TiddlerEncryptionPlugin(store, tiddler);
};
function CheckTiddlerForDecryption_TiddlerEncryptionPlugin(tiddler) {
if(tiddler && tiddler.tags) {
for(var g=0; g<tiddler.tags.length; g++) {
var tag = tiddler.tags[g];
if(tag.indexOf("Decrypt(") == 0) {
var lastBracket=tag.lastIndexOf(")");
if(lastBracket >= 0) {
if(tiddler.text.substr(0,10) == "Encrypted(") {
var closingSHA1Bracket = tiddler.text.indexOf(")");
var decryptedSHA1 = tiddler.text.substring(10, closingSHA1Bracket);
// Ok, tagged with Decrypt(passwordPrompt)
// extract the passwordPrompt name
var passwordPrompt=tag.substring(8,lastBracket);
// Ok, Decrypt this tiddler!
var decryptedText = tiddler.text.substr(closingSHA1Bracket+2);
decryptedText = HexToString_TiddlerEncryptionPlugin(decryptedText);
// prompt("Decryption request for Tiddler '"+tiddler.title+"'");
var password = GetAndSetPasswordForPromptToDecrypt_TiddlerEncryptionPlugin(passwordPrompt);
if(password) {
decryptedText = TEAdecrypt(decryptedText, password );
var thisDecryptedSHA1 = Crypto.hexSha1Str(decryptedText);
if(decryptedSHA1 == thisDecryptedSHA1) {
tiddler.text = decryptedText;
// Replace the Tag with the Encrypt() tag
tiddler.tags[g]="Encrypt("+passwordPrompt+")";
if(tiddler.tags[tiddler.tags.length-1] == 'excludeLists') {
// Remove exclude lists only if it's the last entry
// as it's automatically put there by encryption
tiddler.tags.length--;
}
if(tiddler.tags[tiddler.tags.length-1] == 'excludeSearch') {
// Remove exclude search only if it's the last entry
// as it's automatically put there by encryption
tiddler.tags.length--;
}
} else {
// Did not decrypt, discard the password from the cache
config.encryptionPasswords[passwordPrompt] = null;
config.encryptionReEnterPasswords = false;
throw "DecryptionFailed";
}
} else {
// no password supplied, dont bother trying to decrypt
config.encryptionReEnterPasswords = false;
throw "DecryptionFailed";
}
} else {
// Tagged as encrypted but not expected format, just leave it unchanged
}
break; // out of for loop
} // if (lastBracket...
} // if(tag.indexOf(...
} // for(var g=0;...
} // if (tiddler && tags)
return tiddler;
};
store.getTiddler_TiddlerEncryptionPlugin = store.getTiddler;
store.getTiddler = function(title) {
var tiddler = store.getTiddler_TiddlerEncryptionPlugin(title);
if(tiddler) { // shadow tiddlers are not expected to be encrypted.
try {
return CheckTiddlerForDecryption_TiddlerEncryptionPlugin(tiddler);
} catch (e) {
if (config.options.chkShowDecryptButtonInContent == true) {
if(e == "DecryptionFailed") {
var tiddler = store.getTiddler("DecryptionFailed");
if(!tiddler) {
tiddler = new Tiddler();
tiddler.set(title,
"<<EncryptionDecryptThis \"Decrypt\" \"Decrypt this tiddler\" \""+title+"\">>",
config.views.wikified.shadowModifier,
version.date,[],version.date);
}
return tiddler;
} // if(e)
}
return(tiddler);
} // catch
} // if(tiddler) {
return null;
};
store.getTiddlerText_TiddlerEncryptionPlugin = store.getTiddlerText;
store.getTiddlerText = function(title,defaultText) {
// Simply retrieve the tiddler, normally, if it requires decryption, it will be decrypted
var decryptedTiddler = store.getTiddler(title);
if(decryptedTiddler) {
return decryptedTiddler.text;
}
//Ok, rather than duplicate all the core code, the above code should fail if we reach here
// let the core code take over.
return store.getTiddlerText_TiddlerEncryptionPlugin(title,defaultText);
};
// Given a prompt, search our cache to see if we have already entered the password.
// Can return null if the user enters nothing.
function MyPrompt_TiddlerEncryptionPlugin(promptString,defaultValue,context) {
if(!context) {
context = {};
}
context.passwordPrompt = promptString;
PasswordPrompt.prompt(MyPromptCallback_TiddlerEncryptionPlugin, context);
return;
}
function MyPromptCallback_TiddlerEncryptionPlugin(context) {
if(context.callbackFunction) {
context.callbackFunction(context);
} else {
config.encryptionPasswords[context.passwordPrompt] = context.password;
story.refreshAllTiddlers(true);
}
return;
}
function GetAndSetPasswordForPrompt_TiddlerEncryptionPlugin(promptString) {
if(!config.encryptionPasswords[promptString]) {
config.encryptionPasswords[promptString] = MyPrompt_TiddlerEncryptionPlugin(promptString, "");
}
return config.encryptionPasswords[promptString]; // may be null, prompt can be cancelled.
}
function GetAndSetPasswordForPromptToDecrypt_TiddlerEncryptionPlugin(promptString) {
if(config.encryptionReEnterPasswords) {
return GetAndSetPasswordForPrompt_TiddlerEncryptionPlugin(promptString);
} else {
return config.encryptionPasswords[promptString];
}
}
// Make the encrypted tiddlies look a little more presentable.
function StringToHext_TiddlerEncryptionPlugin(theString) {
var theResult = "";
for(var i=0; i<theString.length; i++) {
var theHex = theString.charCodeAt(i).toString(16);
if(theHex.length<2) {
theResult += "0"+theHex;
} else {
theResult += theHex;
}
if(i && i % 32 == 0)
theResult += "\n";
}
return theResult;
}
function HexToString_TiddlerEncryptionPlugin(theString) {
var theResult = "";
for(var i=0; i<theString.length; i+=2) {
if(theString.charAt(i) == "\n") {
i--; // cause us to skip over the newline and resume
continue;
}
theResult += String.fromCharCode(parseInt(theString.substr(i, 2),16));
}
return theResult;
}
//
// Heavily leveraged from http://trac.tiddlywiki.org/browser/Trunk/contributors/SaqImtiaz/verticals/Hesperian/PasswordPromptPlugin.js Revision 5635
//
PasswordPrompt ={
prompt : function(callback,context){
if (!context) {
context = {};
}
var box = createTiddlyElement(document.getElementById("contentWrapper"),'div','passwordPromptBox');
box.innerHTML = store.getTiddlerText('PasswordPromptTemplate');
box.style.position = 'absolute';
this.center(box);
document.getElementById('promptDisplayField').value = context.passwordPrompt;
var passwordInputField = document.getElementById('passwordInputField');
passwordInputField.onkeyup = function(ev) {
var e = ev || window.event;
if(e.keyCode == 10 || e.keyCode == 13) { // Enter
PasswordPrompt.submit(callback, context);
}
};
passwordInputField.focus();
document.getElementById('passwordPromptSubmitBtn').onclick = function(){PasswordPrompt.submit(callback,context);};
document.getElementById('passwordPromptCancelBtn').onclick = function(){PasswordPrompt.cancel(callback,context);};
},
center : function(el){
var size = this.getsize(el);
el.style.left = (Math.round(findWindowWidth()/2) - (size.width /2) + findScrollX())+'px';
el.style.top = (Math.round(findWindowHeight()/2) - (size.height /2) + findScrollY())+'px';
},
getsize : function (el){
var x = {};
x.width = el.offsetWidth || el.style.pixelWidth;
x.height = el.offsetHeight || el.style.pixelHeight;
return x;
},
submit : function(cb,context){
context.passwordPrompt = document.getElementById('promptDisplayField').value;
context.password = document.getElementById('passwordInputField').value;
var box = document.getElementById('passwordPromptBox');
box.parentNode.removeChild(box);
cb(context);
return false;
},
cancel : function(cb,context){
var box = document.getElementById('passwordPromptBox');
box.parentNode.removeChild(box);
return false;
},
setStyles : function(){
setStylesheet(
"#passwordPromptBox dd.submit {margin-left:0; font-weight: bold; margin-top:1em;}\n"+
"#passwordPromptBox dd.submit .button {padding:0.5em 1em; border:1px solid #ccc;}\n"+
"#passwordPromptBox dt.heading {margin-bottom:0.5em; font-size:1.2em;}\n"+
"#passwordPromptBox {border:1px solid #ccc;background-color: #eee;padding:1em 2em;}",'passwordPromptStyles');
},
template : '<form action="" onsubmit="return false;" id="passwordPromptForm">\n'+
' <dl>\n'+
' <dt class="heading">Please enter the password:</dt>\n'+
' <dt>Prompt:</dt>\n'+
' <dd><input type="text" readonly id="promptDisplayField" class="display"/></dd>\n'+
' <dt>Password:</dt>\n'+
' <dd><input type="password" tabindex="1" class="input" id="passwordInputField"/></dd>\n'+
' <dd class="submit">\n'+
' <a tabindex="2" href="javascript:;" class="button" id="passwordPromptSubmitBtn">OK</a>\n'+
' <a tabindex="3" href="javascript:;" class="button" id="passwordPromptCancelBtn">Cancel</a>\n'+
' </dd>\n'+
' </dl>\n'+
'</form>',
init : function(){
config.shadowTiddlers.PasswordPromptTemplate = this.template;
this.setStyles();
}
};
PasswordPrompt.init();
// http://www.movable-type.co.uk/scripts/tea-block.html
//
// TEAencrypt: Use Corrected Block TEA to encrypt plaintext using password
// (note plaintext & password must be strings not string objects)
//
// Return encrypted text as string
//
function TEAencrypt(plaintext, password)
{
if (plaintext.length == 0) return(''); // nothing to encrypt
// 'escape' plaintext so chars outside ISO-8859-1 work in single-byte packing, but keep
// spaces as spaces (not '%20') so encrypted text doesn't grow too long (quick & dirty)
var asciitext = escape(plaintext).replace(/%20/g,' ');
var v = strToLongs(asciitext); // convert string to array of longs
if (v.length <= 1) v[1] = 0; // algorithm doesn't work for n<2 so fudge by adding a null
var k = strToLongs(password.slice(0,16)); // simply convert first 16 chars of password as key
var n = v.length;
var z = v[n-1], y = v[0], delta = 0x9E3779B9;
var mx, e, q = Math.floor(6 + 52/n), sum = 0;
while (q-- > 0) { // 6 + 52/n operations gives between 6 & 32 mixes on each word
sum += delta;
e = sum>>>2 & 3;
for (var p = 0; p < n; p++) {
y = v[(p+1)%n];
mx = (z>>>5 ^ y<<2) + (y>>>3 ^ z<<4) ^ (sum^y) + (k[p&3 ^ e] ^ z);
z = v[p] += mx;
}
}
var ciphertext = longsToStr(v);
return escCtrlCh(ciphertext);
}
//
// TEAdecrypt: Use Corrected Block TEA to decrypt ciphertext using password
//
function TEAdecrypt(ciphertext, password)
{
if (ciphertext.length == 0) return('');
var v = strToLongs(unescCtrlCh(ciphertext));
var k = strToLongs(password.slice(0,16));
var n = v.length;
var z = v[n-1], y = v[0], delta = 0x9E3779B9;
var mx, e, q = Math.floor(6 + 52/n), sum = q*delta;
while (sum != 0) {
e = sum>>>2 & 3;
for (var p = n-1; p >= 0; p--) {
z = v[p>0 ? p-1 : n-1];
mx = (z>>>5 ^ y<<2) + (y>>>3 ^ z<<4) ^ (sum^y) + (k[p&3 ^ e] ^ z);
y = v[p] -= mx;
}
sum -= delta;
}
var plaintext = longsToStr(v);
// strip trailing null chars resulting from filling 4-char blocks:
plaintext = plaintext.replace(/\0+$/,'');
return unescape(plaintext);
}
// supporting functions
function strToLongs(s) { // convert string to array of longs, each containing 4 chars
// note chars must be within ISO-8859-1 (with Unicode code-point < 256) to fit 4/long
var l = new Array(Math.ceil(s.length/4));
for (var i=0; i<l.length; i++) {
// note little-endian encoding - endianness is irrelevant as long as
// it is the same in longsToStr()
l[i] = s.charCodeAt(i*4) + (s.charCodeAt(i*4+1)<<8) +
(s.charCodeAt(i*4+2)<<16) + (s.charCodeAt(i*4+3)<<24);
}
return l; // note running off the end of the string generates nulls since
} // bitwise operators treat NaN as 0
function longsToStr(l) { // convert array of longs back to string
var a = new Array(l.length);
for (var i=0; i<l.length; i++) {
a[i] = String.fromCharCode(l[i] & 0xFF, l[i]>>>8 & 0xFF,
l[i]>>>16 & 0xFF, l[i]>>>24 & 0xFF);
}
return a.join(''); // use Array.join() rather than repeated string appends for efficiency
}
function escCtrlCh(str) { // escape control chars etc which might cause problems with encrypted texts
return str.replace(/[\0\t\n\v\f\r\xa0'"!]/g, function(c) { return '!' + c.charCodeAt(0) + '!'; });
}
function unescCtrlCh(str) { // unescape potentially problematic nulls and control characters
return str.replace(/!\d\d?\d?!/g, function(c) { return String.fromCharCode(c.slice(1,-1)); });
}
//}}}
Encrypted(56BEF68D0FE9BB28DDA863618639112DF387F49E)
07a2ab2131363021c728bd8d7121313121161e5d3913deac1bcff4c8df41fb5f57
be20d72131312159bc6eeced52d9f3ad468ed3f3a45332d1833b452e1e24e5b0
a7e09972bbe021333921edc6a224529e3c71ac6b9e3416d85c36e12c53206144
1423c7d5f3727f7f3cef2130216efd59cd592e90f6ee08468a40133021313021
6499b928b708153d36489f4ae9d820559e7ff204766e467be158c2078ff212c2
1077c8485a7fe996e8fadfc08948a5a3355a3c4d6cbaa2468f906581986f50d3
c781377a0e2b8111153ad6d77cd8cc4bdb5f3e181b521cc53833a3a3b49368bc
fb5580c018
This wiki houses the personal research endevours I embark on during the course of my graduate studies at [[U of T|http://cs.toronto.edu/]]. It is meant as a personal whiteboard for me to return to when various things pop into my head.
Due to the possibility of random researchers scooping my potential projects, various sections with soon-to-be-published ideas are encrypted. If I've given you the go-ahead to view this, you can decrypt the text by clicking: <<EncryptionDecryptAll>>
Encrypted(FAD094ADBDFB29620E1D63C27814F1A32030C17E)
74e5c0e2ef377a313f5a213132215a2c21333321ee2f6a01213021382868b12131
3121bbb2f0c8a272dbd7762a1946819bf28dc87ba91285f62e5636666ef0056b
b9e78a3d9c149ab8a8a8eb1b086fe9c2b98f4dd2386ca955ad767d8d3c866d60
7f78e776772a442c9243fb2133342121313321985ce6f17043571ecb7ab78ff8
8931cd9421333421f206e50f4dfedf91d8cddcc9e0f44a316529a963f4213131
21187c31b9fc9d6da82133332114cf5dfcd43d7448862d57836beb4eea5c5cca
94570721313321169f7e4869d960ea9163854baff52131322199ad2abf4863e6
c35fa2a72f23eb5621313121d1e69726964ae02eb11007e8dd2bd32321333321
a940dc7cb734cdf39a2b7e706221313630213e73a4e8a52ac11e494dffb5b5e2
b7df68861c99c92b932131332121313021e98fee9aa3186fece737dfce96ffbd
b29f21313221c15ad42c7ab15824e8688f1264bc3dcd1cc9cb63137c5f213334
2199ff66d4d28deb7a7155da4983d6ef752130215a4b213133211dc7f976ee90
faf936ad8f0fd90f1f95ead7726e68d5e134ded3d52131363021e15f2bb1