No subject
From: ()
Date: Mon Dec 3 19:58:15 EST 2012 |
|
keep during a `git filter-branch' on every commit, but that's not
ideal. For example, a file in collection "a" that is destined for
package "a" may have originated in "b" (think "mzlib"), where the
same-named file sticks around in "b" after the copy. It's nicer and
cleaner to have irrelevant files disappear after the relevant copy/move
is made.
So, I took one more step: "slice.rkt" constructs a range of commits
during which the file should exist, based on when it was moved or
copied. (Forks and merges are a minor obstacle, which the script works
around by enlarging ranges to hit commits in the `--first-parent'
traversal.) Conceptually, the result is a mapping from commit ids to
paths, but that would be a big table to read on every `filter-branch'
step, so it's reported as a table of commits with enter/leave
transitions. The output of "slice.rkt" is files: "state.rktd" for the
set of files to be kept in the initial commit, and "actions.rktd" to
specify the transitions.
The enclosed "prune.rkt" script works with `git filter-branch
--index-filter'. It uses "actions.rktd" (read-only) and "state.rktd"
(which it updates via transitions).
The Racket git repo is large, so I've only tried the `git
filter-branch' step so far on smaller repos, such as the "iplt"
repository. In my clone of "iplt", I `git mv'ed "web/internal" to
"ex/internal". Then, with the scripts in "/tmp",
racket /tmp/slice.rkt ex /tmp
git filter-branch --index-filter "racket /tmp/prune.rkt /tmp" --prune-empty
leaves the repo with only the files of "ex", and `git log --follow'
on various files looks right.
I'll try on a clone of the Racket repo and report back.
FWIW, before doing this for real, I'd want to add a `--msg-filter' that
extends each commit message to add the original commit id, since we
have references to the old ids in various places (and so it would be
handy to have them in the new repos).
-----199958252996-----
Content-Type: application/octet-stream;
name="slice.rkt"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename="slice.rkt"
I2xhbmcgcmFja2V0CgooZGVmaW5lIGdpdC1leGUgIi91c3IvYmluL2dpdCIpCgooZGVmaW5l
LXZhbHVlcyAoc3ViZGlyIGRlc3QtZGlyKQogIChjb21tYW5kLWxpbmUKICAgIzphcmdzCiAg
IChzdWJkaXIgZGVzdC1kaXIpCiAgICh2YWx1ZXMgc3ViZGlyIGRlc3QtZGlyKSkpCgoKKGRl
ZmluZSAoZmlsdGVyLWlucHV0IGZpbHRlciAuIGNtZCkKICAoZGVmaW5lLXZhbHVlcyAocCBv
dXQgaW4gZXJyKQogICAgKGFwcGx5IHN1YnByb2Nlc3MKICAgICAgICAgICAjZgogICAgICAg
ICAgIChjdXJyZW50LWlucHV0LXBvcnQpCiAgICAgICAgICAgKGN1cnJlbnQtb3V0cHV0LXBv
cnQpCiAgICAgICAgICAgY21kKSkKICAoYmVnaW4wCiAgIChmb3IqL2xpc3QgKFtsIChpbi1s
aW5lcyBvdXQpXQogICAgICAgICAgICAgICBbdiAoaW4tdmFsdWUgKGZpbHRlciBsKSldCiAg
ICAgICAgICAgICAgICM6d2hlbiB2KQogICAgIHYpCiAgIChjbG9zZS1pbnB1dC1wb3J0IG91
dCkKICAgKHN1YnByb2Nlc3Mtd2FpdCBwKSkpCgooZGVmaW5lIGNvbW1pdHMKICAoZmlsdGVy
LWlucHV0CiAgIHN0cmluZy1zcGxpdAogICBnaXQtZXhlCiAgICJsb2ciCiAgICItLXByZXR0
eT0lSCAlUCIpKQoKKGRlZmluZSBoZWFkLWNvbW1pdCAoY2FhciBjb21taXRzKSkKCihkZWZp
bmUgY29tbWl0LT5wYXJlbnRzCiAgKGZvci9oYXNoIChbY3MgKGluLWxpc3QgY29tbWl0cyld
KQogICAgKHZhbHVlcyAoY2FyIGNzKSAoY2RyIGNzKSkpKQoKKGRlZmluZSBjb21taXQtPmNo
aWxkcmVuCiAgKGZvciovZm9sZCAoW2h0IChoYXNoKV0pIChbKGsgdikgKGluLWhhc2ggY29t
bWl0LT5wYXJlbnRzKV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoYykgKGluLWxp
c3QgdildKQogICAgKGhhc2gtdXBkYXRlIGh0IGMgKGxhbWJkYSAocCkgKGNvbnMgayBwKSkg
bnVsbCkpKQoKKGRlZmluZSBtYWluLWxpbmUtY29tbWl0cwogIChsZXQgbG9vcCAoW2EgaGVh
ZC1jb21taXRdKQogICAgKGNvbnMgYQogICAgICAgICAgKGxldCAoW3AgKGhhc2gtcmVmIGNv
bW1pdC0+cGFyZW50cyBhKV0pCiAgICAgICAgICAgIChpZiAobnVsbD8gcCkKICAgICAgICAg
ICAgICAgIG51bGwKICAgICAgICAgICAgICAgIChsb29wIChjYXIgcCkpKSkpKSkKCihkZWZp
bmUgY29tbWl0LT5tYWluPwogIChmb3IvaGFzaCAoW2YgKGluLWxpc3QgbWFpbi1saW5lLWNv
bW1pdHMpXSkKICAgICh2YWx1ZXMgZiAjdCkpKQoKKGRlZmluZSAoYWR2YW5jZS10by1tYWlu
IGNvbW1pdCkKICAoaWYgKGhhc2gtcmVmIGNvbW1pdC0+bWFpbj8gY29tbWl0ICNmKQogICAg
ICBjb21taXQKICAgICAgKGFkdmFuY2UtdG8tbWFpbiAoY2FyIChoYXNoLXJlZiBjb21taXQt
PmNoaWxkcmVuIGNvbW1pdCkpKSkpCgooZGVmaW5lIGZpbGVzCiAgKGZvci9saXN0IChbZiAo
aW4tZGlyZWN0b3J5IHN1YmRpcildCiAgICAgICAgICAgICAjOndoZW4gKGZpbGUtZXhpc3Rz
PyBmKSkKICAgIChwYXRoLT5zdHJpbmcgZikpKQoKKGRlZmluZSBsaWZldGltZXMgKG1ha2Ut
aGFzaCkpCgo7OyBTaW5jZSBhIGZpbGUgY2FuIGJlIGNvcGllZCwgaXQgbWlnaHQgaGF2ZSBt
dWx0aXBsZSAiZW5kaW5nIgo7OyBwb2ludHMgaW4gdGhlIGxpZmV0aW1lcyBvZiBkaWZmZXJl
bnQgZmlsZXMsIHNvIG1ha2Ugc3VyZSB3ZQo7OyBjb25zaWRlciBpdHMgbGF0ZXN0IGVuZGlu
ZyBwb2ludC4KKGRlZmluZSAoYWxyZWFkeS1zdGFydGVkLWxhdGVyPyBmIHN0YXJ0LWNvbW1p
dCkKICAoZGVmaW5lIGx0IChoYXNoLXJlZiBsaWZldGltZXMgZiAjZikpCiAgKGFuZCBsdAog
ICAgICAgKGxldCAoW29sZC1zdGFydC1jb21taXQgKGNhciBsdCldKQogICAgICAgICAoZGVm
aW5lIG0gKG1lbWJlciBvbGQtc3RhcnQtY29tbWl0IG1haW4tbGluZS1jb21taXRzKSkKICAg
ICAgICAgKHVubGVzcyBtIChlcnJvciAnc2xpZGUgInN0YXJ0IGNvbW1pdCBub3QgZm91bmQg
aW4gbWFpbiBsaW5lOiB+YSIgb2xkLXN0YXJ0LWNvbW1pdCkpCiAgICAgICAgIChvciAobWVt
YmVyIHN0YXJ0LWNvbW1pdCBtKQogICAgICAgICAgICAgKGJlZ2luCiAgICAgICAgICAgICAg
ICh1bmxlc3MgKG1lbWJlciBzdGFydC1jb21taXQgbWFpbi1saW5lLWNvbW1pdHMpCiAgICAg
ICAgICAgICAgICAgKGVycm9yICdzbGlkZSAibmV3IHN0YXJ0IGNvbW1pdCBub3QgZm91bmQg
aW4gbWFpbiBsaW5lOiB+YSIgc3RhcnQtY29tbWl0KSkKICAgICAgICAgICAgICAgI2YpKSkp
KQoKOzsgRGV0ZXJtaW5lIHRoZSBjb21taXQgcmFuZ2UgdGhhdCBhcHBsaWVzIHRvIGEgZmls
ZS4KOzsgV2UgdXNlIGBnaXQgbG9nIC0tZm9sbG93JyBmb3IgdGhpcywgYmVjYXVzZSBpdCdz
IGdvb2QKOzsgYXQgZmluZCB0aGUgcG9pbnQgYXQgd2hpY2ggYSBmaWxlIG5hbWUgY2hhbmdl
cy4KOzsgV2UgZG9uJ3QgdXNlIGBnaXQgbG9nIC0tZm9sbG93JyB0byBnZXQgdGhlIGZ1bGwg
aGlzdG9yeQo7OyBvZiBhIGZpbGUsIGJlY2F1c2UgaXQncyBpbmNvbXBsZXRlIGFmdGVyIGEg
cmVuYW1lLgooZGVmaW5lIChmaW5kLWxpZmV0aW1lISBmIHN0YXJ0LWNvbW1pdCkKICAodW5s
ZXNzIChhbHJlYWR5LXN0YXJ0ZWQtbGF0ZXI/IGYgc3RhcnQtY29tbWl0KQogICAgKGxldCAo
W2N1cnJlbnQtbmFtZSBmXQogICAgICAgICAgW3ByZXYtbmFtZSAjZl0KICAgICAgICAgIFtp
bi1jb21taXQgI2ZdCiAgICAgICAgICBbZG9uZT8gI2ZdKQogICAgICAoZGVmaW5lIChkby1j
b21taXQhKQogICAgICAgICh3aGVuIChhbmQgaW4tY29tbWl0IHByZXYtbmFtZSkKICAgICAg
ICAgIChwcmludGYgIn5hIDogfmEuLi5+YV5cbiIgcHJldi1uYW1lIHN0YXJ0LWNvbW1pdCBp
bi1jb21taXQpCiAgICAgICAgICAoaGFzaC1zZXQhIGxpZmV0aW1lcyBwcmV2LW5hbWUgKGNv
bnMgc3RhcnQtY29tbWl0IGluLWNvbW1pdCkpCiAgICAgICAgICAoZmluZC1saWZldGltZSEg
Y3VycmVudC1uYW1lIChhZHZhbmNlLXRvLW1haW4gaW4tY29tbWl0KSkKICAgICAgICAgIChz
ZXQhIGRvbmU/ICN0KSkpCiAgICAgICh2b2lkCiAgICAgICAoZmlsdGVyLWlucHV0CiAgICAg
ICAgKGxhbWJkYSAobCkKICAgICAgICAgIChjb25kCiAgICAgICAgICAgW2RvbmU/ICh2b2lk
KV0KICAgICAgICAgICBbKHJlZ2V4cC1tYXRjaCAjcngiXmNvbW1pdCAoLiopJCIgbCkKICAg
ICAgICAgICAgPT4KICAgICAgICAgICAgKGxhbWJkYSAobSkKICAgICAgICAgICAgICAoZG8t
Y29tbWl0ISkKICAgICAgICAgICAgICAoc2V0ISBpbi1jb21taXQgKGNhZHIgbSkpKV0KICAg
ICAgICAgICBbKHJlZ2V4cC1tYXRjaCAjcngiXig/OmNvcHl8cmVuYW1lKSB0byAoLiopJCIg
bCkKICAgICAgICAgICAgPT4KICAgICAgICAgICAgKGxhbWJkYSAobSkKICAgICAgICAgICAg
ICAoZGVmaW5lIG9sZC1uYW1lIChjYWRyIG0pKQogICAgICAgICAgICAgICh1bmxlc3MgKGVx
dWFsPyBvbGQtbmFtZSBwcmV2LW5hbWUpCiAgICAgICAgICAgICAgICAoZXJyb3IgJ3NsaWNl
ICh+YSAiY29uZnVzZWQgYnkgcmVuYW1lXG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAiICBjdXJyZW50OiB+YVxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIiAgZnJvbTogfmEiKQogICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtbmFt
ZQogICAgICAgICAgICAgICAgICAgICAgIG9sZC1uYW1lKSkpXQogICAgICAgICAgIFsocmVn
ZXhwLW1hdGNoICNyeCJeKD86Y29weXxyZW5hbWUpIGZyb20gKC4qKSQiIGwpCiAgICAgICAg
ICAgID0+CiAgICAgICAgICAgIChsYW1iZGEgKG0pCiAgICAgICAgICAgICAgKHNldCEgcHJl
di1uYW1lIGN1cnJlbnQtbmFtZSkKICAgICAgICAgICAgICAoc2V0ISBjdXJyZW50LW5hbWUg
KGNhZHIgbSkpKV0pCiAgICAgICAgICAjZikKICAgICAgICBnaXQtZXhlCiAgICAgICAgImxv
ZyIKICAgICAgICAiLS1mb2xsb3ciCiAgICAgICAgIi1wIgogICAgICAgIHN0YXJ0LWNvbW1p
dAogICAgICAgICItLSIKICAgICAgICBmKSkKICAgICAgKHVubGVzcyBkb25lPwogICAgICAg
IChkby1jb21taXQhKSkKICAgICAgKHVubGVzcyBkb25lPwogICAgICAgIChwcmludGYgIn5h
IDogfmEuLi5cbiIgY3VycmVudC1uYW1lIHN0YXJ0LWNvbW1pdCkKICAgICAgICAoaGFzaC1z
ZXQhIGxpZmV0aW1lcyBjdXJyZW50LW5hbWUgKGNvbnMgc3RhcnQtY29tbWl0ICNmKSkpKSkp
Cgo7OyBDb2xsZWN0IGxpZmV0aW1lcyBvZiBhbGwgaW50ZXJlc3RpbmcgZmlsZXMsIHN0YXJ0
aW5nCjs7IHdpdGggdGhlIG9uZXMgd2Ugd2FudCBpbiB0aGUgZW5kOgooZm9yIChbZiAoaW4t
bGlzdCBmaWxlcyldKQogIChmaW5kLWxpZmV0aW1lISBmIGhlYWQtY29tbWl0KSkKCihkZWZp
bmUgY29tbWl0LT5hY3Rpb25zIChtYWtlLWhhc2gpKQoKKGZvciAoWyhmIGx0KSAoaW4taGFz
aCBsaWZldGltZXMpXSkKICAoaGFzaC11cGRhdGUhIGNvbW1pdC0+YWN0aW9ucwogICAgICAg
ICAgICAgICAgKGNhciBsdCkKICAgICAgICAgICAgICAgIChsYW1iZGEgKGwpCiAgICAgICAg
ICAgICAgICAgIChjb25zIGAobGVhdmUgLGYpIGwpKQogICAgICAgICAgICAgICAgbnVsbCkK
ICAoaGFzaC11cGRhdGUhIGNvbW1pdC0+YWN0aW9ucwogICAgICAgICAgICAgICAgKGNkciBs
dCkKICAgICAgICAgICAgICAgIChsYW1iZGEgKGwpCiAgICAgICAgICAgICAgICAgIChjb25z
IGAoZW50ZXIgLGYpIGwpKQogICAgICAgICAgICAgICAgbnVsbCkpCgood2l0aC1vdXRwdXQt
dG8tZmlsZSAoYnVpbGQtcGF0aCBkZXN0LWRpciAic3RhdGUucmt0ZCIpCiAgIzpleGlzdHMg
J3RydW5jYXRlCiAgKGxhbWJkYSAoKQogICAgKHdyaXRlCiAgICAgKGZvci9oYXNoIChbYSAo
aW4tbGlzdCAoaGFzaC1yZWYgY29tbWl0LT5hY3Rpb25zICNmIG51bGwpKV0pCiAgICAgICAo
dmFsdWVzIChjYWRyIGEpICN0KSkpKSkKCihoYXNoLXJlbW92ZSEgY29tbWl0LT5hY3Rpb25z
ICNmKQood2l0aC1vdXRwdXQtdG8tZmlsZSAoYnVpbGQtcGF0aCBkZXN0LWRpciAiYWN0aW9u
cy5ya3RkIikKICAjOmV4aXN0cyAndHJ1bmNhdGUKICAobGFtYmRhICgpCiAgICAod3JpdGUg
KGZvci9oYXNoIChbKGsgdikgKGluLWhhc2ggY29tbWl0LT5hY3Rpb25zKV0pCiAgICAgICAg
ICAgICAodmFsdWVzIChzdHJpbmctPmJ5dGVzL3V0Zi04IGspIHYpKSkpKQoKICAgICAgICAg
ICAgICAgICAgICAgCg==
-----199958252996-----
Content-Type: application/octet-stream;
name="prune.rkt"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename="prune.rkt"
I2xhbmcgcmFja2V0L2tlcm5lbAoKKGRlZmluZS12YWx1ZXMgKGRpcikgKHZlY3Rvci1yZWYg
KGN1cnJlbnQtY29tbWFuZC1saW5lLWFyZ3VtZW50cykgMCkpCgooZGVmaW5lLXZhbHVlcyAo
c3RhdGUtZmlsZSkgKGJ1aWxkLXBhdGggZGlyICJzdGF0ZS5ya3RkIikpCihkZWZpbmUtdmFs
dWVzIChhY3Rpb25zcy1maWxlKSAoYnVpbGQtcGF0aCBkaXIgImFjdGlvbnMucmt0ZCIpKQoK
KGRlZmluZS12YWx1ZXMgKGFjdGlvbnNzKSAoY2FsbC13aXRoLWlucHV0LWZpbGUgYWN0aW9u
c3MtZmlsZSByZWFkKSkKCihkZWZpbmUtdmFsdWVzIChrZWVwcykgKGNhbGwtd2l0aC1pbnB1
dC1maWxlIHN0YXRlLWZpbGUgcmVhZCkpCgooZGVmaW5lLXZhbHVlcyAoY29tbWl0KQogIChl
bnZpcm9ubWVudC12YXJpYWJsZXMtcmVmIChjdXJyZW50LWVudmlyb25tZW50LXZhcmlhYmxl
cykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIkdJVF9DT01NSVQiKSkKCiM7Cihj
YWxsLXdpdGgtb3V0cHV0LWZpbGUKICAgIChidWlsZC1wYXRoIGRpciAibG9nIikKICAobGFt
YmRhIChvKSAoZnByaW50ZiBvICJ+c1xucHJlOiB+c1xuIiBjb21taXQga2VlcHMpKQogICdh
cHBlbmQpCgooZGVmaW5lLXZhbHVlcyAoYWN0aW9ucykgKGhhc2gtcmVmIGFjdGlvbnNzIGNv
bW1pdCBudWxsKSkKCihmb3ItZWFjaCAobGFtYmRhIChhKQogICAgICAgICAgICAoaWYgKGVx
PyAoY2FyIGEpICdlbnRlcikKICAgICAgICAgICAgICAgIChzZXQhIGtlZXBzIChoYXNoLXNl
dCBrZWVwcyAoY2FkciBhKSAjdCkpCiAgICAgICAgICAgICAgICAodm9pZCkpKQogICAgICAg
ICAgYWN0aW9ucykKCihkZWZpbmUtdmFsdWVzIChwIGkgbyBlKSAoc3VicHJvY2VzcyAjZgog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGN1cnJlbnQtaW5wdXQtcG9y
dCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjdXJyZW50LWVycm9y
LXBvcnQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL3Vzci9iaW4v
Z2l0IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxzLWZpbGVzIikp
CihkZWZpbmUtdmFsdWVzIChsb29wKQogIChsYW1iZGEgKGwpCiAgICAoZGVmaW5lLXZhbHVl
cyAocikgKHJlYWQtbGluZSBpKSkKICAgIChpZiAoZW9mLW9iamVjdD8gcikKICAgICAgICBs
CiAgICAgICAgKGlmIChoYXNoLXJlZiBrZWVwcyByICNmKQogICAgICAgICAgICAobG9vcCBs
KQogICAgICAgICAgICAobG9vcCAoY29ucyByIGwpKSkpKSkKCihkZWZpbmUtdmFsdWVzIChm
aWxlcykgKGxvb3AgbnVsbCkpCgooZGVmaW5lLXZhbHVlcyAoc3BsaXQpCiAgKGxhbWJkYSAo
YSBsIGkpCiAgICAoaWYgKHplcm8/IGkpCiAgICAgICAgKHZhbHVlcyBhIGwpCiAgICAgICAg
KGlmIChudWxsPyBsKQogICAgICAgICAgICAodmFsdWVzIGEgbnVsbCkKICAgICAgICAgICAg
KHNwbGl0IChjb25zIChjYXIgbCkgYSkKICAgICAgICAgICAgICAgICAgIChjZHIgbCkKICAg
ICAgICAgICAgICAgICAgIChzdWIxIGkpKSkpKSkKCihkZWZpbmUtdmFsdWVzIChkby1pbi1j
aHVua3MpCiAgKGxhbWJkYSAobCkKICAgIChkZWZpbmUtdmFsdWVzIChjaHVuayByZXN0KSAo
c3BsaXQgbnVsbCBsIDEwMjQpKQogICAgKGRlZmluZS12YWx1ZXMgKHAyIGkyIG8yIGUyKSAo
YXBwbHkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnByb2Nlc3MgCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY3VycmVudC1vdXRwdXQtcG9ydCkK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjdXJyZW50LWlucHV0LXBvcnQp
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY3VycmVudC1lcnJvci1wb3J0
KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi91c3IvYmluL2dpdCIKICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJybSIKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICItLWNhY2hlZCIKICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICItcSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rKSkK
ICAgIChzdWJwcm9jZXNzLXdhaXQgcDIpCiAgICAoaWYgKG51bGw/IHJlc3QpCiAgICAgICAg
KHZvaWQpCiAgICAgICAgKGRvLWluLWNodW5rcyByZXN0KSkpKQoKKGlmIChudWxsPyBmaWxl
cykKICAgICh2b2lkKQogICAgKGRvLWluLWNodW5rcyBmaWxlcykpCgooZm9yLWVhY2ggKGxh
bWJkYSAoYSkKICAgICAgICAgICAgKGlmIChlcT8gKGNhciBhKSAnbGVhdmUpCiAgICAgICAg
ICAgICAgICAoc2V0ISBrZWVwcyAoaGFzaC1yZW1vdmUga2VlcHMgKGNhZHIgYSkpKQogICAg
ICAgICAgICAgICAgKHZvaWQpKSkKICAgICAgICAgIGFjdGlvbnMpCgooaWYgKG51bGw/IGFj
dGlvbnMpCiAgICB2b2lkCiAgICAoY2FsbC13aXRoLW91dHB1dC1maWxlIHN0YXRlLWZpbGUg
KGxhbWJkYSAobykgKHdyaXRlIGtlZXBzIG8pKSAndHJ1bmNhdGUpKQoKIzsKKGNhbGwtd2l0
aC1vdXRwdXQtZmlsZQogICAgKGJ1aWxkLXBhdGggZGlyICJsb2ciKQogIChsYW1iZGEgKG8p
IChmcHJpbnRmIG8gIn5hXG5wb3N0OiB+c1xuIiBjb21taXQga2VlcHMpKQogICdhcHBlbmQp
Cg==
-----199958252996-------