From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jonathan Leech-Pepin Subject: Re: how can I insert a new heading after all at this level? Date: Mon, 25 Feb 2013 11:28:44 -0500 Message-ID: References: Mime-Version: 1.0 Content-Type: multipart/alternative; boundary=f46d0434c0acead6d004d68f08fd Return-path: Received: from eggs.gnu.org ([208.118.235.92]:46465) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UA0v5-0007xj-GK for emacs-orgmode@gnu.org; Mon, 25 Feb 2013 11:28:54 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UA0uz-0005L3-Oo for emacs-orgmode@gnu.org; Mon, 25 Feb 2013 11:28:51 -0500 Received: from mail-ve0-f177.google.com ([209.85.128.177]:35311) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UA0uz-0005Kt-Io for emacs-orgmode@gnu.org; Mon, 25 Feb 2013 11:28:45 -0500 Received: by mail-ve0-f177.google.com with SMTP id m1so2294152ves.22 for ; Mon, 25 Feb 2013 08:28:45 -0800 (PST) In-Reply-To: List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: David Naumann Cc: emacs-orgmode@gnu.org --f46d0434c0acead6d004d68f08fd Content-Type: text/plain; charset=UTF-8 Hello David, On 19 February 2013 14:53, David Naumann wrote: > I'm a happy, frequent user of org mode but there's something I can't > figure out from the manual. > > What I would like to be able to do is insert a new heading at the same > level as current, _following_ all the others. For example, with the > cursor on the A in this tree: > > * top > -> ** A > ** B > ** C > * next > > I would like to insert a last sibling and move to it: > > * top > ** A > ** B > ** C > -> ** > * next > > Use case: adding to a very long chronological list. I have not seen a > quick way to do this using the structure motion/editing commands in > the manual, without scrolling in one way or another. > > If you have a hint, please reply to my address; I'm not on this > mailing list. > The following is a little long, however only one function is actually interactive. #+begin_src emacs-lisp (require 'org-element) (defun zin/org-next-element () "Move to the end of the current element (start of next)." (let ((end (org-element-property :end (org-element-at-point)))) (goto-char end))) (defun zin/org-element-check-element (type &optional name) "Check if current element is of type TYPE. If not move to next element using `zin/org-next-element'. If NAME is non-nil, verify that the :name or :drawer-name property matches it." (save-excursion (save-restriction (save-excursion (org-up-element) (org-narrow-to-element)) (catch 'element (while (not (eobp)) (let ((cur-type (car (org-element-at-point))) ;; Allows for adaptation to non-headline cases. (cur-name (or (org-element-property :name (org-element-at-point)) (org-element-property :drawer-name (org-element-at-point))))) (if (and (string= type cur-type) (string= name cur-name)) (throw 'element (point)) (zin/org-next-element)))))))) (defun zin/org-element-start-or-end (start &optional level) "Find start or ending point of an element's content. If START is non-nil, return the beginning of the content, if nil return the end. If LEVEL is equal to 1, parse the buffer for level 1 headlines. Any other value is ignored." ;; If level is 1, looking at top level headlines, there is no ;; containing element. (if (and level (= 1 level)) (let* ((map (org-element-map (org-element-parse-buffer) 'headline (lambda (hl) ;; return a list of beginning and ending ;; points of all level 1 headlines. (list (org-element-property :begin hl) (org-element-property :end hl))) 'nil 'nil 'headline)) ;; Find smallest (when start is 't) or largest (when ;; start is 'nil) point. (point (if start (apply 'min (mapcar 'car map)) (apply 'max (mapcar 'cadr map))))) point) ;; Not in a top level headline, deal with contents directly. (let ((top (org-element-property :contents-begin (org-element-at-point))) (bottom (org-element-property :contents-end (org-element-at-point)))) (if start top bottom)))) (defun zin/org-add-heading (start &optional title) "Create a new heading at the before or after all headings of current level. If START is non-nil, the new heading will be the first in the list. If nil it will be created after all the others. With optional TITLE, automatically insert the desired title, leaving the point on the following line." (interactive "P") (org-back-to-heading) (let* ((level (org-element-property :level (org-element-at-point))) (point (save-excursion (ignore-errors (org-up-element)) (zin/org-element-start-or-end start level))) ;; Org-element minimal version of a headline at LEVEL with ;; TITLE (or blank) (headline `(headline (:level ,level :title ,(or title ""))))) (if start ;; If placing headline above existing headlines, ensure you do ;; not place it above the content of the parent headline. (progn ;; Search from top of content of parent headline. Without ;; this it will put it above the current headline. (goto-char point) ;; Do not check to make sure content is skipped if in a ;; level 1 headline, just return the start of the top ;; headline. (unless (= 1 level) (goto-char (zin/org-element-check-element "headline")))) (goto-char point)) (org-save-outline-visibility 't ;; Insert a parsed version of the headline (newline) (delete-char -1) (insert (org-element-interpret-data headline)) ;; If there is a title provided, put point on start of next line, ;; otherwise return point to headline to insert title. (if title (open-line 1) (backward-char 1))))) #+end_src Calling zin/org-add-heading will insert a new heading at the bottom of the current set of headlines (of the current level). Calling it with the prefix argument: C-u M-x zin/org-add-heading will insert it as the first headline at that level. Regards, Jon --f46d0434c0acead6d004d68f08fd Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: base64 SGVsbG8gRGF2aWQsPGJyPjxicj48ZGl2IGNsYXNzPSJnbWFpbF9xdW90ZSI+T24gMTkgRmVicnVh cnkgMjAxMyAxNDo1MywgRGF2aWQgTmF1bWFubiA8c3BhbiBkaXI9Imx0ciI+Jmx0OzxhIGhyZWY9 Im1haWx0bzpuYXVtYW5uQGNzLnN0ZXZlbnMuZWR1IiB0YXJnZXQ9Il9ibGFuayI+bmF1bWFubkBj cy5zdGV2ZW5zLmVkdTwvYT4mZ3Q7PC9zcGFuPiB3cm90ZTo8YnI+PGJsb2NrcXVvdGUgY2xhc3M9 ImdtYWlsX3F1b3RlIiBzdHlsZT0ibWFyZ2luOjAgMCAwIC44ZXg7Ym9yZGVyLWxlZnQ6MXB4ICNj Y2Mgc29saWQ7cGFkZGluZy1sZWZ0OjFleCI+DQpJJiMzOTttIGEgaGFwcHksIGZyZXF1ZW50IHVz ZXIgb2Ygb3JnIG1vZGUgYnV0IHRoZXJlJiMzOTtzIHNvbWV0aGluZyBJIGNhbiYjMzk7dCBmaWd1 cmUgb3V0IGZyb20gdGhlIG1hbnVhbC48YnI+DQo8YnI+DQpXaGF0IEkgd291bGQgbGlrZSB0byBi ZSBhYmxlIHRvIGRvIGlzIGluc2VydCBhIG5ldyBoZWFkaW5nIGF0IHRoZSBzYW1lPGJyPg0KbGV2 ZWwgYXMgY3VycmVudCwgX2ZvbGxvd2luZ18gYWxsIHRoZSBvdGhlcnMuIMKgRm9yIGV4YW1wbGUs IHdpdGggdGhlPGJyPg0KY3Vyc29yIG9uIHRoZSBBIGluIHRoaXMgdHJlZTo8YnI+DQo8YnI+DQrC oCDCoCAqIHRvcDxicj4NCi0mZ3Q7IMKgKiogQTxicj4NCsKgIMKgICoqIEI8YnI+DQrCoCDCoCAq KiBDPGJyPg0KwqAgwqAgKiBuZXh0PGJyPg0KPGJyPg0KSSB3b3VsZCBsaWtlIHRvIGluc2VydCBh IGxhc3Qgc2libGluZyBhbmQgbW92ZSB0byBpdDo8YnI+DQo8YnI+DQrCoCDCoCAqIHRvcDxicj4N CsKgIMKgICoqIEE8YnI+DQrCoCDCoCAqKiBCPGJyPg0KwqAgwqAgKiogQzxicj4NCi0mZ3Q7IMKg Kio8YnI+DQrCoCDCoCAqIG5leHQ8YnI+DQo8YnI+DQpVc2UgY2FzZTogYWRkaW5nIHRvIGEgdmVy eSBsb25nIGNocm9ub2xvZ2ljYWwgbGlzdC4gwqBJIGhhdmUgbm90IHNlZW4gYTxicj4NCnF1aWNr IHdheSB0byBkbyB0aGlzIHVzaW5nIHRoZSBzdHJ1Y3R1cmUgbW90aW9uL2VkaXRpbmcgY29tbWFu ZHMgaW48YnI+DQp0aGUgbWFudWFsLCB3aXRob3V0IHNjcm9sbGluZyBpbiBvbmUgd2F5IG9yIGFu b3RoZXIuPGJyPg0KPGJyPg0KSWYgeW91IGhhdmUgYSBoaW50LCBwbGVhc2UgcmVwbHkgdG8gbXkg YWRkcmVzczsgSSYjMzk7bSBub3Qgb24gdGhpczxicj4NCm1haWxpbmcgbGlzdC48YnI+PC9ibG9j a3F1b3RlPjxkaXY+PGJyPlRoZSBmb2xsb3dpbmcgaXMgYSBsaXR0bGUgbG9uZywgaG93ZXZlciBv bmx5IG9uZSBmdW5jdGlvbiBpcyBhY3R1YWxseTxicj5pbnRlcmFjdGl2ZS48YnI+PGJyPiMrYmVn aW5fc3JjIGVtYWNzLWxpc3A8YnI+wqAgKHJlcXVpcmUgJiMzOTtvcmctZWxlbWVudCk8YnI+wqAg PGJyPsKgIChkZWZ1biB6aW4vb3JnLW5leHQtZWxlbWVudCAoKTxicj4NCsKgwqDCoCAmcXVvdDtN b3ZlIHRvIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgZWxlbWVudCAoc3RhcnQgb2YgbmV4dCkuJnF1 b3Q7PGJyPsKgwqDCoCAobGV0ICgoZW5kIChvcmctZWxlbWVudC1wcm9wZXJ0eSA6ZW5kIChvcmct ZWxlbWVudC1hdC1wb2ludCkpKSk8YnI+wqDCoMKgwqDCoCAoZ290by1jaGFyIGVuZCkpKTxicj7C oCA8YnI+wqAgKGRlZnVuIHppbi9vcmctZWxlbWVudC1jaGVjay1lbGVtZW50ICh0eXBlICZhbXA7 b3B0aW9uYWwgbmFtZSk8YnI+DQrCoMKgwqAgJnF1b3Q7Q2hlY2sgaWYgY3VycmVudCBlbGVtZW50 IGlzIG9mIHR5cGUgVFlQRS48YnI+wqAgSWYgbm90IG1vdmUgdG8gbmV4dCBlbGVtZW50IHVzaW5n IGB6aW4vb3JnLW5leHQtZWxlbWVudCYjMzk7Ljxicj7CoCA8YnI+wqAgSWYgTkFNRSBpcyBub24t bmlsLCB2ZXJpZnkgdGhhdCB0aGUgOm5hbWUgb3IgOmRyYXdlci1uYW1lPGJyPsKgIHByb3BlcnR5 IG1hdGNoZXMgaXQuJnF1b3Q7PGJyPg0KwqDCoMKgIChzYXZlLWV4Y3Vyc2lvbjxicj7CoMKgwqDC oMKgIChzYXZlLXJlc3RyaWN0aW9uPGJyPsKgwqDCoMKgwqDCoMKgIChzYXZlLWV4Y3Vyc2lvbjxi cj7CoMKgwqDCoMKgwqDCoMKgwqAgKG9yZy11cC1lbGVtZW50KTxicj7CoMKgwqDCoMKgwqDCoMKg wqAgKG9yZy1uYXJyb3ctdG8tZWxlbWVudCkpPGJyPsKgwqDCoMKgwqDCoCAoY2F0Y2ggJiMzOTtl bGVtZW50PGJyPsKgwqDCoMKgwqDCoMKgwqAgKHdoaWxlIChub3QgKGVvYnApKTxicj7CoMKgwqDC oMKgwqDCoMKgwqDCoCAobGV0ICgoY3VyLXR5cGUgKGNhciAob3JnLWVsZW1lbnQtYXQtcG9pbnQp KSk8YnI+DQrCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCA7OyBBbGxvd3MgZm9yIGFk YXB0YXRpb24gdG8gbm9uLWhlYWRsaW5lIGNhc2VzLjxicj7CoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCAoY3VyLW5hbWUgKG9yIChvcmctZWxlbWVudC1wcm9wZXJ0eTxicj7CoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCA6 bmFtZSAob3JnLWVsZW1lbnQtYXQtcG9pbnQpKTxicj7CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKG9yZy1lbGVtZW50LXByb3BlcnR5 PGJyPg0KwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgOmRyYXdlci1uYW1lIChvcmctZWxlbWVudC1hdC1wb2ludCkpKSkpPGJyPsKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAoaWYgKGFuZCAoc3RyaW5nPSB0eXBlIGN1ci10eXBlKTxi cj7CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKHN0cmluZz0gbmFt ZSBjdXItbmFtZSkpPGJyPsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICh0aHJvdyAm IzM5O2VsZW1lbnQgKHBvaW50KSk8YnI+DQrCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICh6 aW4vb3JnLW5leHQtZWxlbWVudCkpKSkpKSkpPGJyPsKgIDxicj7CoCAoZGVmdW4gemluL29yZy1l bGVtZW50LXN0YXJ0LW9yLWVuZCAoc3RhcnQgJmFtcDtvcHRpb25hbCBsZXZlbCk8YnI+wqDCoMKg ICZxdW90O0ZpbmQgc3RhcnQgb3IgZW5kaW5nIHBvaW50IG9mIGFuIGVsZW1lbnQmIzM5O3MgY29u dGVudC48YnI+wqAgPGJyPsKgIElmIFNUQVJUIGlzIG5vbi1uaWwsIHJldHVybiB0aGUgYmVnaW5u aW5nIG9mIHRoZSBjb250ZW50LCBpZiBuaWw8YnI+DQrCoCByZXR1cm4gdGhlIGVuZC48YnI+wqAg PGJyPsKgIElmIExFVkVMIGlzIGVxdWFsIHRvIDEsIHBhcnNlIHRoZSBidWZmZXIgZm9yIGxldmVs IDEgaGVhZGxpbmVzLjxicj7CoCBBbnkgb3RoZXIgdmFsdWUgaXMgaWdub3JlZC4mcXVvdDs8YnI+ wqDCoMKgIDs7IElmIGxldmVsIGlzIDEsIGxvb2tpbmcgYXQgdG9wIGxldmVsIGhlYWRsaW5lcywg dGhlcmUgaXMgbm88YnI+wqDCoMKgIDs7IGNvbnRhaW5pbmcgZWxlbWVudC48YnI+DQrCoMKgwqAg KGlmIChhbmQgbGV2ZWw8YnI+wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICg9IDEgbGV2ZWwpKTxi cj7CoMKgwqDCoMKgwqDCoCAobGV0KiAoKG1hcMKgwqAgKG9yZy1lbGVtZW50LW1hcCAob3JnLWVs ZW1lbnQtcGFyc2UtYnVmZmVyKSAmIzM5O2hlYWRsaW5lPGJyPsKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKGxhbWJkYSAoaGwpPGJyPsKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIDs7IHJldHVybiBhIGxpc3Qgb2Yg YmVnaW5uaW5nIGFuZCBlbmRpbmc8YnI+DQrCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCA7OyBwb2ludHMgb2YgYWxsIGxldmVsIDEgaGVhZGxpbmVzLjxi cj7CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAobGlz dDxicj7CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IChvcmctZWxlbWVudC1wcm9wZXJ0eSA6YmVnaW4gaGwpPGJyPsKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKG9yZy1lbGVtZW50LXByb3BlcnR5IDpl bmQgaGwpKSkgJiMzOTtuaWwgJiMzOTtuaWwgJiMzOTtoZWFkbGluZSkpPGJyPg0KwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCA7OyBGaW5kIHNtYWxsZXN0ICh3aGVuIHN0YXJ0IGlzICYjMzk7 dCkgb3IgbGFyZ2VzdCAod2hlbjxicj7CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIDs7IHN0 YXJ0IGlzICYjMzk7bmlsKSBwb2ludC48YnI+wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAo cG9pbnQgKGlmIHN0YXJ0PGJyPsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIChhcHBseSAmIzM5O21pbiAobWFwY2FyICYjMzk7Y2FyIG1hcCkpPGJyPg0K wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAoYXBwbHkgJiMz OTttYXggKG1hcGNhciAmIzM5O2NhZHIgbWFwKSkpKSk8YnI+wqDCoMKgwqDCoMKgwqDCoMKgIHBv aW50KTxicj7CoMKgwqDCoMKgIDs7IE5vdCBpbiBhIHRvcCBsZXZlbCBoZWFkbGluZSwgZGVhbCB3 aXRoIGNvbnRlbnRzIGRpcmVjdGx5Ljxicj7CoMKgwqDCoMKgIChsZXQgKCh0b3DCoMKgwqAgKG9y Zy1lbGVtZW50LXByb3BlcnR5IDpjb250ZW50cy1iZWdpbiAob3JnLWVsZW1lbnQtYXQtcG9pbnQp KSk8YnI+DQrCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIChib3R0b20gKG9yZy1lbGVtZW50LXByb3Bl cnR5IDpjb250ZW50cy1lbmQgKG9yZy1lbGVtZW50LWF0LXBvaW50KSkpKTxicj7CoMKgwqDCoMKg wqDCoCAoaWYgc3RhcnQ8YnI+wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB0b3A8YnI+wqDCoMKgwqDC oMKgwqDCoMKgIGJvdHRvbSkpKSk8YnI+wqAgPGJyPsKgIChkZWZ1biB6aW4vb3JnLWFkZC1oZWFk aW5nIChzdGFydCAmYW1wO29wdGlvbmFsIHRpdGxlKTxicj7CoMKgwqAgJnF1b3Q7Q3JlYXRlIGEg bmV3IGhlYWRpbmcgYXQgdGhlIGJlZm9yZSBvciBhZnRlciBhbGwgaGVhZGluZ3Mgb2YgY3VycmVu dCBsZXZlbC48YnI+DQrCoCA8YnI+wqAgSWYgU1RBUlQgaXMgbm9uLW5pbCwgdGhlIG5ldyBoZWFk aW5nIHdpbGwgYmUgdGhlIGZpcnN0IGluIHRoZTxicj7CoCBsaXN0LsKgIElmIG5pbCBpdCB3aWxs IGJlIGNyZWF0ZWQgYWZ0ZXIgYWxsIHRoZSBvdGhlcnMuPGJyPsKgIDxicj7CoCBXaXRoIG9wdGlv bmFsIFRJVExFLCBhdXRvbWF0aWNhbGx5IGluc2VydCB0aGUgZGVzaXJlZCB0aXRsZSw8YnI+wqAg bGVhdmluZyB0aGUgcG9pbnQgb24gdGhlIGZvbGxvd2luZyBsaW5lLiZxdW90Ozxicj4NCsKgwqDC oCAoaW50ZXJhY3RpdmUgJnF1b3Q7UCZxdW90Oyk8YnI+wqDCoMKgIChvcmctYmFjay10by1oZWFk aW5nKTxicj7CoMKgwqAgKGxldCogKChsZXZlbCAob3JnLWVsZW1lbnQtcHJvcGVydHkgOmxldmVs IChvcmctZWxlbWVudC1hdC1wb2ludCkpKTxicj7CoMKgwqDCoMKgwqDCoMKgwqDCoCAocG9pbnQg KHNhdmUtZXhjdXJzaW9uPGJyPsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IChpZ25vcmUtZXJyb3JzIChvcmctdXAtZWxlbWVudCkpPGJyPg0KwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgKHppbi9vcmctZWxlbWVudC1zdGFydC1vci1lbmQgc3RhcnQg bGV2ZWwpKSk8YnI+wqDCoMKgwqDCoMKgwqDCoMKgwqAgOzsgT3JnLWVsZW1lbnQgbWluaW1hbCB2 ZXJzaW9uIG9mIGEgaGVhZGxpbmUgYXQgTEVWRUwgd2l0aDxicj7CoMKgwqDCoMKgwqDCoMKgwqDC oCA7OyBUSVRMRSAob3IgYmxhbmspPGJyPsKgwqDCoMKgwqDCoMKgwqDCoMKgIChoZWFkbGluZSBg KGhlYWRsaW5lICg6bGV2ZWwgLGxldmVsIDp0aXRsZSAsKG9yIHRpdGxlICZxdW90OyZxdW90Oykp KSkpPGJyPg0KwqDCoMKgwqDCoCAoaWYgc3RhcnQ8YnI+wqDCoMKgwqDCoMKgwqDCoMKgIDs7IElm IHBsYWNpbmcgaGVhZGxpbmUgYWJvdmUgZXhpc3RpbmcgaGVhZGxpbmVzLCBlbnN1cmUgeW91IGRv PGJyPsKgwqDCoMKgwqDCoMKgwqDCoCA7OyBub3QgcGxhY2UgaXQgYWJvdmUgdGhlIGNvbnRlbnQg b2YgdGhlIHBhcmVudCBoZWFkbGluZS48YnI+wqDCoMKgwqDCoMKgwqDCoMKgIChwcm9nbjxicj7C oMKgwqDCoMKgwqDCoMKgwqDCoMKgIDs7IFNlYXJjaCBmcm9tIHRvcCBvZiBjb250ZW50IG9mIHBh cmVudCBoZWFkbGluZS7CoCBXaXRob3V0PGJyPg0KwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCA7OyB0 aGlzIGl0IHdpbGwgcHV0IGl0IGFib3ZlIHRoZSBjdXJyZW50IGhlYWRsaW5lLjxicj7CoMKgwqDC oMKgwqDCoMKgwqDCoMKgIChnb3RvLWNoYXIgcG9pbnQpPGJyPsKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgOzsgRG8gbm90IGNoZWNrIHRvIG1ha2Ugc3VyZSBjb250ZW50IGlzIHNraXBwZWQgaWYgaW4g YTxicj7CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIDs7IGxldmVsIDEgaGVhZGxpbmUsIGp1c3QgcmV0 dXJuIHRoZSBzdGFydCBvZiB0aGUgdG9wPGJyPg0KwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCA7OyBo ZWFkbGluZS48YnI+wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAodW5sZXNzPGJyPsKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCAoPSAxIGxldmVsKTxicj7CoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCAoZ290by1jaGFyICh6aW4vb3JnLWVsZW1lbnQtY2hlY2stZWxlbWVudCAmcXVvdDtoZWFk bGluZSZxdW90OykpKSk8YnI+wqDCoMKgwqDCoMKgwqAgKGdvdG8tY2hhciBwb2ludCkpPGJyPsKg wqDCoMKgwqAgKG9yZy1zYXZlLW91dGxpbmUtdmlzaWJpbGl0eSAmIzM5O3Q8YnI+DQrCoMKgwqDC oMKgwqDCoCA7OyBJbnNlcnQgYSBwYXJzZWQgdmVyc2lvbiBvZiB0aGUgaGVhZGxpbmU8YnI+wqDC oMKgwqDCoMKgwqAgKG5ld2xpbmUpPGJyPsKgwqDCoMKgwqDCoMKgIChkZWxldGUtY2hhciAtMSk8 YnI+wqDCoMKgwqDCoMKgwqAgKGluc2VydCAob3JnLWVsZW1lbnQtaW50ZXJwcmV0LWRhdGEgaGVh ZGxpbmUpKTxicj7CoMKgwqDCoMKgwqDCoCA7OyBJZiB0aGVyZSBpcyBhIHRpdGxlIHByb3ZpZGVk LCBwdXQgcG9pbnQgb24gc3RhcnQgb2YgbmV4dCBsaW5lLDxicj4NCsKgwqDCoMKgwqDCoMKgIDs7 IG90aGVyd2lzZSByZXR1cm4gcG9pbnQgdG8gaGVhZGxpbmUgdG8gaW5zZXJ0IHRpdGxlLjxicj7C oMKgwqDCoMKgwqDCoCAoaWYgdGl0bGU8YnI+wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAob3Blbi1s aW5lIDEpPGJyPsKgwqDCoMKgwqDCoMKgwqDCoCAoYmFja3dhcmQtY2hhciAxKSkpKSk8YnI+Iytl bmRfc3JjPGJyPjxicj5DYWxsaW5nIHppbi9vcmctYWRkLWhlYWRpbmcgd2lsbCBpbnNlcnQgYSBu ZXcgaGVhZGluZyBhdCB0aGUgYm90dG9tIG9mPGJyPg0KdGhlIGN1cnJlbnQgc2V0IG9mIGhlYWRs aW5lcyAob2YgdGhlIGN1cnJlbnQgbGV2ZWwpLsKgIENhbGxpbmcgaXQgd2l0aDxicj50aGUgcHJl Zml4IGFyZ3VtZW50OiBDLXUgTS14IHppbi9vcmctYWRkLWhlYWRpbmcgd2lsbCBpbnNlcnQgaXQg YXMgdGhlPGJyPmZpcnN0IGhlYWRsaW5lIGF0IHRoYXQgbGV2ZWwuPGJyPjxicj5SZWdhcmRzLDxi cj48YnI+Sm9uPGJyPjwvZGl2PjwvZGl2Pg0K --f46d0434c0acead6d004d68f08fd--