docurium 0.4.1 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.github/workflows/main.yml +42 -0
- data/Gemfile +4 -4
- data/README.md +0 -15
- data/bin/cm +19 -2
- data/docurium.gemspec +7 -6
- data/lib/docurium/cli.rb +6 -1
- data/lib/docurium/debug.rb +41 -0
- data/lib/docurium/docparser.rb +96 -27
- data/lib/docurium/layout.rb +0 -3
- data/lib/docurium/version.rb +1 -1
- data/lib/docurium.rb +276 -92
- data/lib/libdetect.rb +1 -1
- data/site/css/style.css +17 -11
- data/site/index.html +133 -122
- data/site/js/backbone.js +1 -1
- data/site/js/docurium.js +178 -162
- data/site/js/underscore.js +5 -5
- data/test/docurium_test.rb +235 -0
- data/test/fixtures/git2/cherrypick.h +19 -0
- data/test/fixtures/git2/common.h +1 -0
- data/test/fixtures/git2/repository.h +39 -0
- data/test/fixtures/git2/types.h +2 -0
- data/test/gen_test.rb +2 -2
- data/test/parser_test.rb +18 -14
- metadata +38 -23
- data/.travis.yml +0 -13
- data/test/repo_test.rb +0 -136
data/site/js/underscore.js
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
|
2
|
-
//
|
3
|
-
//
|
1
|
+
!function(n,r){"object"==typeof exports&&"undefined"!=typeof module?module.exports=r():"function"==typeof define&&define.amd?define("underscore",r):(n="undefined"!=typeof globalThis?globalThis:n||self,function(){var t=n._,e=n._=r();e.noConflict=function(){return n._=t,e}}())}(this,(function(){
|
2
|
+
// Underscore.js 1.13.1
|
3
|
+
// https://underscorejs.org
|
4
|
+
// (c) 2009-2021 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors
|
4
5
|
// Underscore may be freely distributed under the MIT license.
|
5
|
-
(function(){var n=this,t=n._,r=Array.prototype,e=Object.prototype,u=Function.prototype,i=r.push,a=r.slice,o=r.concat,l=e.toString,c=e.hasOwnProperty,f=Array.isArray,s=Object.keys,p=u.bind,h=function(n){return n instanceof h?n:this instanceof h?void(this._wrapped=n):new h(n)};"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=h),exports._=h):n._=h,h.VERSION="1.7.0";var g=function(n,t,r){if(t===void 0)return n;switch(null==r?3:r){case 1:return function(r){return n.call(t,r)};case 2:return function(r,e){return n.call(t,r,e)};case 3:return function(r,e,u){return n.call(t,r,e,u)};case 4:return function(r,e,u,i){return n.call(t,r,e,u,i)}}return function(){return n.apply(t,arguments)}};h.iteratee=function(n,t,r){return null==n?h.identity:h.isFunction(n)?g(n,t,r):h.isObject(n)?h.matches(n):h.property(n)},h.each=h.forEach=function(n,t,r){if(null==n)return n;t=g(t,r);var e,u=n.length;if(u===+u)for(e=0;u>e;e++)t(n[e],e,n);else{var i=h.keys(n);for(e=0,u=i.length;u>e;e++)t(n[i[e]],i[e],n)}return n},h.map=h.collect=function(n,t,r){if(null==n)return[];t=h.iteratee(t,r);for(var e,u=n.length!==+n.length&&h.keys(n),i=(u||n).length,a=Array(i),o=0;i>o;o++)e=u?u[o]:o,a[o]=t(n[e],e,n);return a};var v="Reduce of empty array with no initial value";h.reduce=h.foldl=h.inject=function(n,t,r,e){null==n&&(n=[]),t=g(t,e,4);var u,i=n.length!==+n.length&&h.keys(n),a=(i||n).length,o=0;if(arguments.length<3){if(!a)throw new TypeError(v);r=n[i?i[o++]:o++]}for(;a>o;o++)u=i?i[o]:o,r=t(r,n[u],u,n);return r},h.reduceRight=h.foldr=function(n,t,r,e){null==n&&(n=[]),t=g(t,e,4);var u,i=n.length!==+n.length&&h.keys(n),a=(i||n).length;if(arguments.length<3){if(!a)throw new TypeError(v);r=n[i?i[--a]:--a]}for(;a--;)u=i?i[a]:a,r=t(r,n[u],u,n);return r},h.find=h.detect=function(n,t,r){var e;return t=h.iteratee(t,r),h.some(n,function(n,r,u){return t(n,r,u)?(e=n,!0):void 0}),e},h.filter=h.select=function(n,t,r){var e=[];return null==n?e:(t=h.iteratee(t,r),h.each(n,function(n,r,u){t(n,r,u)&&e.push(n)}),e)},h.reject=function(n,t,r){return h.filter(n,h.negate(h.iteratee(t)),r)},h.every=h.all=function(n,t,r){if(null==n)return!0;t=h.iteratee(t,r);var e,u,i=n.length!==+n.length&&h.keys(n),a=(i||n).length;for(e=0;a>e;e++)if(u=i?i[e]:e,!t(n[u],u,n))return!1;return!0},h.some=h.any=function(n,t,r){if(null==n)return!1;t=h.iteratee(t,r);var e,u,i=n.length!==+n.length&&h.keys(n),a=(i||n).length;for(e=0;a>e;e++)if(u=i?i[e]:e,t(n[u],u,n))return!0;return!1},h.contains=h.include=function(n,t){return null==n?!1:(n.length!==+n.length&&(n=h.values(n)),h.indexOf(n,t)>=0)},h.invoke=function(n,t){var r=a.call(arguments,2),e=h.isFunction(t);return h.map(n,function(n){return(e?t:n[t]).apply(n,r)})},h.pluck=function(n,t){return h.map(n,h.property(t))},h.where=function(n,t){return h.filter(n,h.matches(t))},h.findWhere=function(n,t){return h.find(n,h.matches(t))},h.max=function(n,t,r){var e,u,i=-1/0,a=-1/0;if(null==t&&null!=n){n=n.length===+n.length?n:h.values(n);for(var o=0,l=n.length;l>o;o++)e=n[o],e>i&&(i=e)}else t=h.iteratee(t,r),h.each(n,function(n,r,e){u=t(n,r,e),(u>a||u===-1/0&&i===-1/0)&&(i=n,a=u)});return i},h.min=function(n,t,r){var e,u,i=1/0,a=1/0;if(null==t&&null!=n){n=n.length===+n.length?n:h.values(n);for(var o=0,l=n.length;l>o;o++)e=n[o],i>e&&(i=e)}else t=h.iteratee(t,r),h.each(n,function(n,r,e){u=t(n,r,e),(a>u||1/0===u&&1/0===i)&&(i=n,a=u)});return i},h.shuffle=function(n){for(var t,r=n&&n.length===+n.length?n:h.values(n),e=r.length,u=Array(e),i=0;e>i;i++)t=h.random(0,i),t!==i&&(u[i]=u[t]),u[t]=r[i];return u},h.sample=function(n,t,r){return null==t||r?(n.length!==+n.length&&(n=h.values(n)),n[h.random(n.length-1)]):h.shuffle(n).slice(0,Math.max(0,t))},h.sortBy=function(n,t,r){return t=h.iteratee(t,r),h.pluck(h.map(n,function(n,r,e){return{value:n,index:r,criteria:t(n,r,e)}}).sort(function(n,t){var r=n.criteria,e=t.criteria;if(r!==e){if(r>e||r===void 0)return 1;if(e>r||e===void 0)return-1}return n.index-t.index}),"value")};var m=function(n){return function(t,r,e){var u={};return r=h.iteratee(r,e),h.each(t,function(e,i){var a=r(e,i,t);n(u,e,a)}),u}};h.groupBy=m(function(n,t,r){h.has(n,r)?n[r].push(t):n[r]=[t]}),h.indexBy=m(function(n,t,r){n[r]=t}),h.countBy=m(function(n,t,r){h.has(n,r)?n[r]++:n[r]=1}),h.sortedIndex=function(n,t,r,e){r=h.iteratee(r,e,1);for(var u=r(t),i=0,a=n.length;a>i;){var o=i+a>>>1;r(n[o])<u?i=o+1:a=o}return i},h.toArray=function(n){return n?h.isArray(n)?a.call(n):n.length===+n.length?h.map(n,h.identity):h.values(n):[]},h.size=function(n){return null==n?0:n.length===+n.length?n.length:h.keys(n).length},h.partition=function(n,t,r){t=h.iteratee(t,r);var e=[],u=[];return h.each(n,function(n,r,i){(t(n,r,i)?e:u).push(n)}),[e,u]},h.first=h.head=h.take=function(n,t,r){return null==n?void 0:null==t||r?n[0]:0>t?[]:a.call(n,0,t)},h.initial=function(n,t,r){return a.call(n,0,Math.max(0,n.length-(null==t||r?1:t)))},h.last=function(n,t,r){return null==n?void 0:null==t||r?n[n.length-1]:a.call(n,Math.max(n.length-t,0))},h.rest=h.tail=h.drop=function(n,t,r){return a.call(n,null==t||r?1:t)},h.compact=function(n){return h.filter(n,h.identity)};var y=function(n,t,r,e){if(t&&h.every(n,h.isArray))return o.apply(e,n);for(var u=0,a=n.length;a>u;u++){var l=n[u];h.isArray(l)||h.isArguments(l)?t?i.apply(e,l):y(l,t,r,e):r||e.push(l)}return e};h.flatten=function(n,t){return y(n,t,!1,[])},h.without=function(n){return h.difference(n,a.call(arguments,1))},h.uniq=h.unique=function(n,t,r,e){if(null==n)return[];h.isBoolean(t)||(e=r,r=t,t=!1),null!=r&&(r=h.iteratee(r,e));for(var u=[],i=[],a=0,o=n.length;o>a;a++){var l=n[a];if(t)a&&i===l||u.push(l),i=l;else if(r){var c=r(l,a,n);h.indexOf(i,c)<0&&(i.push(c),u.push(l))}else h.indexOf(u,l)<0&&u.push(l)}return u},h.union=function(){return h.uniq(y(arguments,!0,!0,[]))},h.intersection=function(n){if(null==n)return[];for(var t=[],r=arguments.length,e=0,u=n.length;u>e;e++){var i=n[e];if(!h.contains(t,i)){for(var a=1;r>a&&h.contains(arguments[a],i);a++);a===r&&t.push(i)}}return t},h.difference=function(n){var t=y(a.call(arguments,1),!0,!0,[]);return h.filter(n,function(n){return!h.contains(t,n)})},h.zip=function(n){if(null==n)return[];for(var t=h.max(arguments,"length").length,r=Array(t),e=0;t>e;e++)r[e]=h.pluck(arguments,e);return r},h.object=function(n,t){if(null==n)return{};for(var r={},e=0,u=n.length;u>e;e++)t?r[n[e]]=t[e]:r[n[e][0]]=n[e][1];return r},h.indexOf=function(n,t,r){if(null==n)return-1;var e=0,u=n.length;if(r){if("number"!=typeof r)return e=h.sortedIndex(n,t),n[e]===t?e:-1;e=0>r?Math.max(0,u+r):r}for(;u>e;e++)if(n[e]===t)return e;return-1},h.lastIndexOf=function(n,t,r){if(null==n)return-1;var e=n.length;for("number"==typeof r&&(e=0>r?e+r+1:Math.min(e,r+1));--e>=0;)if(n[e]===t)return e;return-1},h.range=function(n,t,r){arguments.length<=1&&(t=n||0,n=0),r=r||1;for(var e=Math.max(Math.ceil((t-n)/r),0),u=Array(e),i=0;e>i;i++,n+=r)u[i]=n;return u};var d=function(){};h.bind=function(n,t){var r,e;if(p&&n.bind===p)return p.apply(n,a.call(arguments,1));if(!h.isFunction(n))throw new TypeError("Bind must be called on a function");return r=a.call(arguments,2),e=function(){if(!(this instanceof e))return n.apply(t,r.concat(a.call(arguments)));d.prototype=n.prototype;var u=new d;d.prototype=null;var i=n.apply(u,r.concat(a.call(arguments)));return h.isObject(i)?i:u}},h.partial=function(n){var t=a.call(arguments,1);return function(){for(var r=0,e=t.slice(),u=0,i=e.length;i>u;u++)e[u]===h&&(e[u]=arguments[r++]);for(;r<arguments.length;)e.push(arguments[r++]);return n.apply(this,e)}},h.bindAll=function(n){var t,r,e=arguments.length;if(1>=e)throw new Error("bindAll must be passed function names");for(t=1;e>t;t++)r=arguments[t],n[r]=h.bind(n[r],n);return n},h.memoize=function(n,t){var r=function(e){var u=r.cache,i=t?t.apply(this,arguments):e;return h.has(u,i)||(u[i]=n.apply(this,arguments)),u[i]};return r.cache={},r},h.delay=function(n,t){var r=a.call(arguments,2);return setTimeout(function(){return n.apply(null,r)},t)},h.defer=function(n){return h.delay.apply(h,[n,1].concat(a.call(arguments,1)))},h.throttle=function(n,t,r){var e,u,i,a=null,o=0;r||(r={});var l=function(){o=r.leading===!1?0:h.now(),a=null,i=n.apply(e,u),a||(e=u=null)};return function(){var c=h.now();o||r.leading!==!1||(o=c);var f=t-(c-o);return e=this,u=arguments,0>=f||f>t?(clearTimeout(a),a=null,o=c,i=n.apply(e,u),a||(e=u=null)):a||r.trailing===!1||(a=setTimeout(l,f)),i}},h.debounce=function(n,t,r){var e,u,i,a,o,l=function(){var c=h.now()-a;t>c&&c>0?e=setTimeout(l,t-c):(e=null,r||(o=n.apply(i,u),e||(i=u=null)))};return function(){i=this,u=arguments,a=h.now();var c=r&&!e;return e||(e=setTimeout(l,t)),c&&(o=n.apply(i,u),i=u=null),o}},h.wrap=function(n,t){return h.partial(t,n)},h.negate=function(n){return function(){return!n.apply(this,arguments)}},h.compose=function(){var n=arguments,t=n.length-1;return function(){for(var r=t,e=n[t].apply(this,arguments);r--;)e=n[r].call(this,e);return e}},h.after=function(n,t){return function(){return--n<1?t.apply(this,arguments):void 0}},h.before=function(n,t){var r;return function(){return--n>0?r=t.apply(this,arguments):t=null,r}},h.once=h.partial(h.before,2),h.keys=function(n){if(!h.isObject(n))return[];if(s)return s(n);var t=[];for(var r in n)h.has(n,r)&&t.push(r);return t},h.values=function(n){for(var t=h.keys(n),r=t.length,e=Array(r),u=0;r>u;u++)e[u]=n[t[u]];return e},h.pairs=function(n){for(var t=h.keys(n),r=t.length,e=Array(r),u=0;r>u;u++)e[u]=[t[u],n[t[u]]];return e},h.invert=function(n){for(var t={},r=h.keys(n),e=0,u=r.length;u>e;e++)t[n[r[e]]]=r[e];return t},h.functions=h.methods=function(n){var t=[];for(var r in n)h.isFunction(n[r])&&t.push(r);return t.sort()},h.extend=function(n){if(!h.isObject(n))return n;for(var t,r,e=1,u=arguments.length;u>e;e++){t=arguments[e];for(r in t)c.call(t,r)&&(n[r]=t[r])}return n},h.pick=function(n,t,r){var e,u={};if(null==n)return u;if(h.isFunction(t)){t=g(t,r);for(e in n){var i=n[e];t(i,e,n)&&(u[e]=i)}}else{var l=o.apply([],a.call(arguments,1));n=new Object(n);for(var c=0,f=l.length;f>c;c++)e=l[c],e in n&&(u[e]=n[e])}return u},h.omit=function(n,t,r){if(h.isFunction(t))t=h.negate(t);else{var e=h.map(o.apply([],a.call(arguments,1)),String);t=function(n,t){return!h.contains(e,t)}}return h.pick(n,t,r)},h.defaults=function(n){if(!h.isObject(n))return n;for(var t=1,r=arguments.length;r>t;t++){var e=arguments[t];for(var u in e)n[u]===void 0&&(n[u]=e[u])}return n},h.clone=function(n){return h.isObject(n)?h.isArray(n)?n.slice():h.extend({},n):n},h.tap=function(n,t){return t(n),n};var b=function(n,t,r,e){if(n===t)return 0!==n||1/n===1/t;if(null==n||null==t)return n===t;n instanceof h&&(n=n._wrapped),t instanceof h&&(t=t._wrapped);var u=l.call(n);if(u!==l.call(t))return!1;switch(u){case"[object RegExp]":case"[object String]":return""+n==""+t;case"[object Number]":return+n!==+n?+t!==+t:0===+n?1/+n===1/t:+n===+t;case"[object Date]":case"[object Boolean]":return+n===+t}if("object"!=typeof n||"object"!=typeof t)return!1;for(var i=r.length;i--;)if(r[i]===n)return e[i]===t;var a=n.constructor,o=t.constructor;if(a!==o&&"constructor"in n&&"constructor"in t&&!(h.isFunction(a)&&a instanceof a&&h.isFunction(o)&&o instanceof o))return!1;r.push(n),e.push(t);var c,f;if("[object Array]"===u){if(c=n.length,f=c===t.length)for(;c--&&(f=b(n[c],t[c],r,e)););}else{var s,p=h.keys(n);if(c=p.length,f=h.keys(t).length===c)for(;c--&&(s=p[c],f=h.has(t,s)&&b(n[s],t[s],r,e)););}return r.pop(),e.pop(),f};h.isEqual=function(n,t){return b(n,t,[],[])},h.isEmpty=function(n){if(null==n)return!0;if(h.isArray(n)||h.isString(n)||h.isArguments(n))return 0===n.length;for(var t in n)if(h.has(n,t))return!1;return!0},h.isElement=function(n){return!(!n||1!==n.nodeType)},h.isArray=f||function(n){return"[object Array]"===l.call(n)},h.isObject=function(n){var t=typeof n;return"function"===t||"object"===t&&!!n},h.each(["Arguments","Function","String","Number","Date","RegExp"],function(n){h["is"+n]=function(t){return l.call(t)==="[object "+n+"]"}}),h.isArguments(arguments)||(h.isArguments=function(n){return h.has(n,"callee")}),"function"!=typeof/./&&(h.isFunction=function(n){return"function"==typeof n||!1}),h.isFinite=function(n){return isFinite(n)&&!isNaN(parseFloat(n))},h.isNaN=function(n){return h.isNumber(n)&&n!==+n},h.isBoolean=function(n){return n===!0||n===!1||"[object Boolean]"===l.call(n)},h.isNull=function(n){return null===n},h.isUndefined=function(n){return n===void 0},h.has=function(n,t){return null!=n&&c.call(n,t)},h.noConflict=function(){return n._=t,this},h.identity=function(n){return n},h.constant=function(n){return function(){return n}},h.noop=function(){},h.property=function(n){return function(t){return t[n]}},h.matches=function(n){var t=h.pairs(n),r=t.length;return function(n){if(null==n)return!r;n=new Object(n);for(var e=0;r>e;e++){var u=t[e],i=u[0];if(u[1]!==n[i]||!(i in n))return!1}return!0}},h.times=function(n,t,r){var e=Array(Math.max(0,n));t=g(t,r,1);for(var u=0;n>u;u++)e[u]=t(u);return e},h.random=function(n,t){return null==t&&(t=n,n=0),n+Math.floor(Math.random()*(t-n+1))},h.now=Date.now||function(){return(new Date).getTime()};var _={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},w=h.invert(_),j=function(n){var t=function(t){return n[t]},r="(?:"+h.keys(n).join("|")+")",e=RegExp(r),u=RegExp(r,"g");return function(n){return n=null==n?"":""+n,e.test(n)?n.replace(u,t):n}};h.escape=j(_),h.unescape=j(w),h.result=function(n,t){if(null==n)return void 0;var r=n[t];return h.isFunction(r)?n[t]():r};var x=0;h.uniqueId=function(n){var t=++x+"";return n?n+t:t},h.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var A=/(.)^/,k={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},O=/\\|'|\r|\n|\u2028|\u2029/g,F=function(n){return"\\"+k[n]};h.template=function(n,t,r){!t&&r&&(t=r),t=h.defaults({},t,h.templateSettings);var e=RegExp([(t.escape||A).source,(t.interpolate||A).source,(t.evaluate||A).source].join("|")+"|$","g"),u=0,i="__p+='";n.replace(e,function(t,r,e,a,o){return i+=n.slice(u,o).replace(O,F),u=o+t.length,r?i+="'+\n((__t=("+r+"))==null?'':_.escape(__t))+\n'":e?i+="'+\n((__t=("+e+"))==null?'':__t)+\n'":a&&(i+="';\n"+a+"\n__p+='"),t}),i+="';\n",t.variable||(i="with(obj||{}){\n"+i+"}\n"),i="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+i+"return __p;\n";try{var a=new Function(t.variable||"obj","_",i)}catch(o){throw o.source=i,o}var l=function(n){return a.call(this,n,h)},c=t.variable||"obj";return l.source="function("+c+"){\n"+i+"}",l},h.chain=function(n){var t=h(n);return t._chain=!0,t};var E=function(n){return this._chain?h(n).chain():n};h.mixin=function(n){h.each(h.functions(n),function(t){var r=h[t]=n[t];h.prototype[t]=function(){var n=[this._wrapped];return i.apply(n,arguments),E.call(this,r.apply(h,n))}})},h.mixin(h),h.each(["pop","push","reverse","shift","sort","splice","unshift"],function(n){var t=r[n];h.prototype[n]=function(){var r=this._wrapped;return t.apply(r,arguments),"shift"!==n&&"splice"!==n||0!==r.length||delete r[0],E.call(this,r)}}),h.each(["concat","join","slice"],function(n){var t=r[n];h.prototype[n]=function(){return E.call(this,t.apply(this._wrapped,arguments))}}),h.prototype.value=function(){return this._wrapped},"function"==typeof define&&define.amd&&define("underscore",[],function(){return h})}).call(this);
|
6
|
-
//# sourceMappingURL=underscore-min.map
|
6
|
+
var n="1.13.1",r="object"==typeof self&&self.self===self&&self||"object"==typeof global&&global.global===global&&global||Function("return this")()||{},t=Array.prototype,e=Object.prototype,u="undefined"!=typeof Symbol?Symbol.prototype:null,o=t.push,i=t.slice,a=e.toString,f=e.hasOwnProperty,c="undefined"!=typeof ArrayBuffer,l="undefined"!=typeof DataView,s=Array.isArray,p=Object.keys,v=Object.create,h=c&&ArrayBuffer.isView,y=isNaN,d=isFinite,g=!{toString:null}.propertyIsEnumerable("toString"),b=["valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"],m=Math.pow(2,53)-1;function j(n,r){return r=null==r?n.length-1:+r,function(){for(var t=Math.max(arguments.length-r,0),e=Array(t),u=0;u<t;u++)e[u]=arguments[u+r];switch(r){case 0:return n.call(this,e);case 1:return n.call(this,arguments[0],e);case 2:return n.call(this,arguments[0],arguments[1],e)}var o=Array(r+1);for(u=0;u<r;u++)o[u]=arguments[u];return o[r]=e,n.apply(this,o)}}function _(n){var r=typeof n;return"function"===r||"object"===r&&!!n}function w(n){return void 0===n}function A(n){return!0===n||!1===n||"[object Boolean]"===a.call(n)}function x(n){var r="[object "+n+"]";return function(n){return a.call(n)===r}}var S=x("String"),O=x("Number"),M=x("Date"),E=x("RegExp"),B=x("Error"),N=x("Symbol"),I=x("ArrayBuffer"),T=x("Function"),k=r.document&&r.document.childNodes;"function"!=typeof/./&&"object"!=typeof Int8Array&&"function"!=typeof k&&(T=function(n){return"function"==typeof n||!1});var D=T,R=x("Object"),F=l&&R(new DataView(new ArrayBuffer(8))),V="undefined"!=typeof Map&&R(new Map),P=x("DataView");var q=F?function(n){return null!=n&&D(n.getInt8)&&I(n.buffer)}:P,U=s||x("Array");function W(n,r){return null!=n&&f.call(n,r)}var z=x("Arguments");!function(){z(arguments)||(z=function(n){return W(n,"callee")})}();var L=z;function $(n){return O(n)&&y(n)}function C(n){return function(){return n}}function K(n){return function(r){var t=n(r);return"number"==typeof t&&t>=0&&t<=m}}function J(n){return function(r){return null==r?void 0:r[n]}}var G=J("byteLength"),H=K(G),Q=/\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/;var X=c?function(n){return h?h(n)&&!q(n):H(n)&&Q.test(a.call(n))}:C(!1),Y=J("length");function Z(n,r){r=function(n){for(var r={},t=n.length,e=0;e<t;++e)r[n[e]]=!0;return{contains:function(n){return r[n]},push:function(t){return r[t]=!0,n.push(t)}}}(r);var t=b.length,u=n.constructor,o=D(u)&&u.prototype||e,i="constructor";for(W(n,i)&&!r.contains(i)&&r.push(i);t--;)(i=b[t])in n&&n[i]!==o[i]&&!r.contains(i)&&r.push(i)}function nn(n){if(!_(n))return[];if(p)return p(n);var r=[];for(var t in n)W(n,t)&&r.push(t);return g&&Z(n,r),r}function rn(n,r){var t=nn(r),e=t.length;if(null==n)return!e;for(var u=Object(n),o=0;o<e;o++){var i=t[o];if(r[i]!==u[i]||!(i in u))return!1}return!0}function tn(n){return n instanceof tn?n:this instanceof tn?void(this._wrapped=n):new tn(n)}function en(n){return new Uint8Array(n.buffer||n,n.byteOffset||0,G(n))}tn.VERSION=n,tn.prototype.value=function(){return this._wrapped},tn.prototype.valueOf=tn.prototype.toJSON=tn.prototype.value,tn.prototype.toString=function(){return String(this._wrapped)};var un="[object DataView]";function on(n,r,t,e){if(n===r)return 0!==n||1/n==1/r;if(null==n||null==r)return!1;if(n!=n)return r!=r;var o=typeof n;return("function"===o||"object"===o||"object"==typeof r)&&function n(r,t,e,o){r instanceof tn&&(r=r._wrapped);t instanceof tn&&(t=t._wrapped);var i=a.call(r);if(i!==a.call(t))return!1;if(F&&"[object Object]"==i&&q(r)){if(!q(t))return!1;i=un}switch(i){case"[object RegExp]":case"[object String]":return""+r==""+t;case"[object Number]":return+r!=+r?+t!=+t:0==+r?1/+r==1/t:+r==+t;case"[object Date]":case"[object Boolean]":return+r==+t;case"[object Symbol]":return u.valueOf.call(r)===u.valueOf.call(t);case"[object ArrayBuffer]":case un:return n(en(r),en(t),e,o)}var f="[object Array]"===i;if(!f&&X(r)){if(G(r)!==G(t))return!1;if(r.buffer===t.buffer&&r.byteOffset===t.byteOffset)return!0;f=!0}if(!f){if("object"!=typeof r||"object"!=typeof t)return!1;var c=r.constructor,l=t.constructor;if(c!==l&&!(D(c)&&c instanceof c&&D(l)&&l instanceof l)&&"constructor"in r&&"constructor"in t)return!1}o=o||[];var s=(e=e||[]).length;for(;s--;)if(e[s]===r)return o[s]===t;if(e.push(r),o.push(t),f){if((s=r.length)!==t.length)return!1;for(;s--;)if(!on(r[s],t[s],e,o))return!1}else{var p,v=nn(r);if(s=v.length,nn(t).length!==s)return!1;for(;s--;)if(p=v[s],!W(t,p)||!on(r[p],t[p],e,o))return!1}return e.pop(),o.pop(),!0}(n,r,t,e)}function an(n){if(!_(n))return[];var r=[];for(var t in n)r.push(t);return g&&Z(n,r),r}function fn(n){var r=Y(n);return function(t){if(null==t)return!1;var e=an(t);if(Y(e))return!1;for(var u=0;u<r;u++)if(!D(t[n[u]]))return!1;return n!==hn||!D(t[cn])}}var cn="forEach",ln="has",sn=["clear","delete"],pn=["get",ln,"set"],vn=sn.concat(cn,pn),hn=sn.concat(pn),yn=["add"].concat(sn,cn,ln),dn=V?fn(vn):x("Map"),gn=V?fn(hn):x("WeakMap"),bn=V?fn(yn):x("Set"),mn=x("WeakSet");function jn(n){for(var r=nn(n),t=r.length,e=Array(t),u=0;u<t;u++)e[u]=n[r[u]];return e}function _n(n){for(var r={},t=nn(n),e=0,u=t.length;e<u;e++)r[n[t[e]]]=t[e];return r}function wn(n){var r=[];for(var t in n)D(n[t])&&r.push(t);return r.sort()}function An(n,r){return function(t){var e=arguments.length;if(r&&(t=Object(t)),e<2||null==t)return t;for(var u=1;u<e;u++)for(var o=arguments[u],i=n(o),a=i.length,f=0;f<a;f++){var c=i[f];r&&void 0!==t[c]||(t[c]=o[c])}return t}}var xn=An(an),Sn=An(nn),On=An(an,!0);function Mn(n){if(!_(n))return{};if(v)return v(n);var r=function(){};r.prototype=n;var t=new r;return r.prototype=null,t}function En(n){return _(n)?U(n)?n.slice():xn({},n):n}function Bn(n){return U(n)?n:[n]}function Nn(n){return tn.toPath(n)}function In(n,r){for(var t=r.length,e=0;e<t;e++){if(null==n)return;n=n[r[e]]}return t?n:void 0}function Tn(n,r,t){var e=In(n,Nn(r));return w(e)?t:e}function kn(n){return n}function Dn(n){return n=Sn({},n),function(r){return rn(r,n)}}function Rn(n){return n=Nn(n),function(r){return In(r,n)}}function Fn(n,r,t){if(void 0===r)return n;switch(null==t?3:t){case 1:return function(t){return n.call(r,t)};case 3:return function(t,e,u){return n.call(r,t,e,u)};case 4:return function(t,e,u,o){return n.call(r,t,e,u,o)}}return function(){return n.apply(r,arguments)}}function Vn(n,r,t){return null==n?kn:D(n)?Fn(n,r,t):_(n)&&!U(n)?Dn(n):Rn(n)}function Pn(n,r){return Vn(n,r,1/0)}function qn(n,r,t){return tn.iteratee!==Pn?tn.iteratee(n,r):Vn(n,r,t)}function Un(){}function Wn(n,r){return null==r&&(r=n,n=0),n+Math.floor(Math.random()*(r-n+1))}tn.toPath=Bn,tn.iteratee=Pn;var zn=Date.now||function(){return(new Date).getTime()};function Ln(n){var r=function(r){return n[r]},t="(?:"+nn(n).join("|")+")",e=RegExp(t),u=RegExp(t,"g");return function(n){return n=null==n?"":""+n,e.test(n)?n.replace(u,r):n}}var $n={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},Cn=Ln($n),Kn=Ln(_n($n)),Jn=tn.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g},Gn=/(.)^/,Hn={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},Qn=/\\|'|\r|\n|\u2028|\u2029/g;function Xn(n){return"\\"+Hn[n]}var Yn=/^\s*(\w|\$)+\s*$/;var Zn=0;function nr(n,r,t,e,u){if(!(e instanceof r))return n.apply(t,u);var o=Mn(n.prototype),i=n.apply(o,u);return _(i)?i:o}var rr=j((function(n,r){var t=rr.placeholder,e=function(){for(var u=0,o=r.length,i=Array(o),a=0;a<o;a++)i[a]=r[a]===t?arguments[u++]:r[a];for(;u<arguments.length;)i.push(arguments[u++]);return nr(n,e,this,this,i)};return e}));rr.placeholder=tn;var tr=j((function(n,r,t){if(!D(n))throw new TypeError("Bind must be called on a function");var e=j((function(u){return nr(n,e,r,this,t.concat(u))}));return e})),er=K(Y);function ur(n,r,t,e){if(e=e||[],r||0===r){if(r<=0)return e.concat(n)}else r=1/0;for(var u=e.length,o=0,i=Y(n);o<i;o++){var a=n[o];if(er(a)&&(U(a)||L(a)))if(r>1)ur(a,r-1,t,e),u=e.length;else for(var f=0,c=a.length;f<c;)e[u++]=a[f++];else t||(e[u++]=a)}return e}var or=j((function(n,r){var t=(r=ur(r,!1,!1)).length;if(t<1)throw new Error("bindAll must be passed function names");for(;t--;){var e=r[t];n[e]=tr(n[e],n)}return n}));var ir=j((function(n,r,t){return setTimeout((function(){return n.apply(null,t)}),r)})),ar=rr(ir,tn,1);function fr(n){return function(){return!n.apply(this,arguments)}}function cr(n,r){var t;return function(){return--n>0&&(t=r.apply(this,arguments)),n<=1&&(r=null),t}}var lr=rr(cr,2);function sr(n,r,t){r=qn(r,t);for(var e,u=nn(n),o=0,i=u.length;o<i;o++)if(r(n[e=u[o]],e,n))return e}function pr(n){return function(r,t,e){t=qn(t,e);for(var u=Y(r),o=n>0?0:u-1;o>=0&&o<u;o+=n)if(t(r[o],o,r))return o;return-1}}var vr=pr(1),hr=pr(-1);function yr(n,r,t,e){for(var u=(t=qn(t,e,1))(r),o=0,i=Y(n);o<i;){var a=Math.floor((o+i)/2);t(n[a])<u?o=a+1:i=a}return o}function dr(n,r,t){return function(e,u,o){var a=0,f=Y(e);if("number"==typeof o)n>0?a=o>=0?o:Math.max(o+f,a):f=o>=0?Math.min(o+1,f):o+f+1;else if(t&&o&&f)return e[o=t(e,u)]===u?o:-1;if(u!=u)return(o=r(i.call(e,a,f),$))>=0?o+a:-1;for(o=n>0?a:f-1;o>=0&&o<f;o+=n)if(e[o]===u)return o;return-1}}var gr=dr(1,vr,yr),br=dr(-1,hr);function mr(n,r,t){var e=(er(n)?vr:sr)(n,r,t);if(void 0!==e&&-1!==e)return n[e]}function jr(n,r,t){var e,u;if(r=Fn(r,t),er(n))for(e=0,u=n.length;e<u;e++)r(n[e],e,n);else{var o=nn(n);for(e=0,u=o.length;e<u;e++)r(n[o[e]],o[e],n)}return n}function _r(n,r,t){r=qn(r,t);for(var e=!er(n)&&nn(n),u=(e||n).length,o=Array(u),i=0;i<u;i++){var a=e?e[i]:i;o[i]=r(n[a],a,n)}return o}function wr(n){var r=function(r,t,e,u){var o=!er(r)&&nn(r),i=(o||r).length,a=n>0?0:i-1;for(u||(e=r[o?o[a]:a],a+=n);a>=0&&a<i;a+=n){var f=o?o[a]:a;e=t(e,r[f],f,r)}return e};return function(n,t,e,u){var o=arguments.length>=3;return r(n,Fn(t,u,4),e,o)}}var Ar=wr(1),xr=wr(-1);function Sr(n,r,t){var e=[];return r=qn(r,t),jr(n,(function(n,t,u){r(n,t,u)&&e.push(n)})),e}function Or(n,r,t){r=qn(r,t);for(var e=!er(n)&&nn(n),u=(e||n).length,o=0;o<u;o++){var i=e?e[o]:o;if(!r(n[i],i,n))return!1}return!0}function Mr(n,r,t){r=qn(r,t);for(var e=!er(n)&&nn(n),u=(e||n).length,o=0;o<u;o++){var i=e?e[o]:o;if(r(n[i],i,n))return!0}return!1}function Er(n,r,t,e){return er(n)||(n=jn(n)),("number"!=typeof t||e)&&(t=0),gr(n,r,t)>=0}var Br=j((function(n,r,t){var e,u;return D(r)?u=r:(r=Nn(r),e=r.slice(0,-1),r=r[r.length-1]),_r(n,(function(n){var o=u;if(!o){if(e&&e.length&&(n=In(n,e)),null==n)return;o=n[r]}return null==o?o:o.apply(n,t)}))}));function Nr(n,r){return _r(n,Rn(r))}function Ir(n,r,t){var e,u,o=-1/0,i=-1/0;if(null==r||"number"==typeof r&&"object"!=typeof n[0]&&null!=n)for(var a=0,f=(n=er(n)?n:jn(n)).length;a<f;a++)null!=(e=n[a])&&e>o&&(o=e);else r=qn(r,t),jr(n,(function(n,t,e){((u=r(n,t,e))>i||u===-1/0&&o===-1/0)&&(o=n,i=u)}));return o}function Tr(n,r,t){if(null==r||t)return er(n)||(n=jn(n)),n[Wn(n.length-1)];var e=er(n)?En(n):jn(n),u=Y(e);r=Math.max(Math.min(r,u),0);for(var o=u-1,i=0;i<r;i++){var a=Wn(i,o),f=e[i];e[i]=e[a],e[a]=f}return e.slice(0,r)}function kr(n,r){return function(t,e,u){var o=r?[[],[]]:{};return e=qn(e,u),jr(t,(function(r,u){var i=e(r,u,t);n(o,r,i)})),o}}var Dr=kr((function(n,r,t){W(n,t)?n[t].push(r):n[t]=[r]})),Rr=kr((function(n,r,t){n[t]=r})),Fr=kr((function(n,r,t){W(n,t)?n[t]++:n[t]=1})),Vr=kr((function(n,r,t){n[t?0:1].push(r)}),!0),Pr=/[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g;function qr(n,r,t){return r in t}var Ur=j((function(n,r){var t={},e=r[0];if(null==n)return t;D(e)?(r.length>1&&(e=Fn(e,r[1])),r=an(n)):(e=qr,r=ur(r,!1,!1),n=Object(n));for(var u=0,o=r.length;u<o;u++){var i=r[u],a=n[i];e(a,i,n)&&(t[i]=a)}return t})),Wr=j((function(n,r){var t,e=r[0];return D(e)?(e=fr(e),r.length>1&&(t=r[1])):(r=_r(ur(r,!1,!1),String),e=function(n,t){return!Er(r,t)}),Ur(n,e,t)}));function zr(n,r,t){return i.call(n,0,Math.max(0,n.length-(null==r||t?1:r)))}function Lr(n,r,t){return null==n||n.length<1?null==r||t?void 0:[]:null==r||t?n[0]:zr(n,n.length-r)}function $r(n,r,t){return i.call(n,null==r||t?1:r)}var Cr=j((function(n,r){return r=ur(r,!0,!0),Sr(n,(function(n){return!Er(r,n)}))})),Kr=j((function(n,r){return Cr(n,r)}));function Jr(n,r,t,e){A(r)||(e=t,t=r,r=!1),null!=t&&(t=qn(t,e));for(var u=[],o=[],i=0,a=Y(n);i<a;i++){var f=n[i],c=t?t(f,i,n):f;r&&!t?(i&&o===c||u.push(f),o=c):t?Er(o,c)||(o.push(c),u.push(f)):Er(u,f)||u.push(f)}return u}var Gr=j((function(n){return Jr(ur(n,!0,!0))}));function Hr(n){for(var r=n&&Ir(n,Y).length||0,t=Array(r),e=0;e<r;e++)t[e]=Nr(n,e);return t}var Qr=j(Hr);function Xr(n,r){return n._chain?tn(r).chain():r}function Yr(n){return jr(wn(n),(function(r){var t=tn[r]=n[r];tn.prototype[r]=function(){var n=[this._wrapped];return o.apply(n,arguments),Xr(this,t.apply(tn,n))}})),tn}jr(["pop","push","reverse","shift","sort","splice","unshift"],(function(n){var r=t[n];tn.prototype[n]=function(){var t=this._wrapped;return null!=t&&(r.apply(t,arguments),"shift"!==n&&"splice"!==n||0!==t.length||delete t[0]),Xr(this,t)}})),jr(["concat","join","slice"],(function(n){var r=t[n];tn.prototype[n]=function(){var n=this._wrapped;return null!=n&&(n=r.apply(n,arguments)),Xr(this,n)}}));var Zr=Yr({__proto__:null,VERSION:n,restArguments:j,isObject:_,isNull:function(n){return null===n},isUndefined:w,isBoolean:A,isElement:function(n){return!(!n||1!==n.nodeType)},isString:S,isNumber:O,isDate:M,isRegExp:E,isError:B,isSymbol:N,isArrayBuffer:I,isDataView:q,isArray:U,isFunction:D,isArguments:L,isFinite:function(n){return!N(n)&&d(n)&&!isNaN(parseFloat(n))},isNaN:$,isTypedArray:X,isEmpty:function(n){if(null==n)return!0;var r=Y(n);return"number"==typeof r&&(U(n)||S(n)||L(n))?0===r:0===Y(nn(n))},isMatch:rn,isEqual:function(n,r){return on(n,r)},isMap:dn,isWeakMap:gn,isSet:bn,isWeakSet:mn,keys:nn,allKeys:an,values:jn,pairs:function(n){for(var r=nn(n),t=r.length,e=Array(t),u=0;u<t;u++)e[u]=[r[u],n[r[u]]];return e},invert:_n,functions:wn,methods:wn,extend:xn,extendOwn:Sn,assign:Sn,defaults:On,create:function(n,r){var t=Mn(n);return r&&Sn(t,r),t},clone:En,tap:function(n,r){return r(n),n},get:Tn,has:function(n,r){for(var t=(r=Nn(r)).length,e=0;e<t;e++){var u=r[e];if(!W(n,u))return!1;n=n[u]}return!!t},mapObject:function(n,r,t){r=qn(r,t);for(var e=nn(n),u=e.length,o={},i=0;i<u;i++){var a=e[i];o[a]=r(n[a],a,n)}return o},identity:kn,constant:C,noop:Un,toPath:Bn,property:Rn,propertyOf:function(n){return null==n?Un:function(r){return Tn(n,r)}},matcher:Dn,matches:Dn,times:function(n,r,t){var e=Array(Math.max(0,n));r=Fn(r,t,1);for(var u=0;u<n;u++)e[u]=r(u);return e},random:Wn,now:zn,escape:Cn,unescape:Kn,templateSettings:Jn,template:function(n,r,t){!r&&t&&(r=t),r=On({},r,tn.templateSettings);var e=RegExp([(r.escape||Gn).source,(r.interpolate||Gn).source,(r.evaluate||Gn).source].join("|")+"|$","g"),u=0,o="__p+='";n.replace(e,(function(r,t,e,i,a){return o+=n.slice(u,a).replace(Qn,Xn),u=a+r.length,t?o+="'+\n((__t=("+t+"))==null?'':_.escape(__t))+\n'":e?o+="'+\n((__t=("+e+"))==null?'':__t)+\n'":i&&(o+="';\n"+i+"\n__p+='"),r})),o+="';\n";var i,a=r.variable;if(a){if(!Yn.test(a))throw new Error("variable is not a bare identifier: "+a)}else o="with(obj||{}){\n"+o+"}\n",a="obj";o="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+o+"return __p;\n";try{i=new Function(a,"_",o)}catch(n){throw n.source=o,n}var f=function(n){return i.call(this,n,tn)};return f.source="function("+a+"){\n"+o+"}",f},result:function(n,r,t){var e=(r=Nn(r)).length;if(!e)return D(t)?t.call(n):t;for(var u=0;u<e;u++){var o=null==n?void 0:n[r[u]];void 0===o&&(o=t,u=e),n=D(o)?o.call(n):o}return n},uniqueId:function(n){var r=++Zn+"";return n?n+r:r},chain:function(n){var r=tn(n);return r._chain=!0,r},iteratee:Pn,partial:rr,bind:tr,bindAll:or,memoize:function(n,r){var t=function(e){var u=t.cache,o=""+(r?r.apply(this,arguments):e);return W(u,o)||(u[o]=n.apply(this,arguments)),u[o]};return t.cache={},t},delay:ir,defer:ar,throttle:function(n,r,t){var e,u,o,i,a=0;t||(t={});var f=function(){a=!1===t.leading?0:zn(),e=null,i=n.apply(u,o),e||(u=o=null)},c=function(){var c=zn();a||!1!==t.leading||(a=c);var l=r-(c-a);return u=this,o=arguments,l<=0||l>r?(e&&(clearTimeout(e),e=null),a=c,i=n.apply(u,o),e||(u=o=null)):e||!1===t.trailing||(e=setTimeout(f,l)),i};return c.cancel=function(){clearTimeout(e),a=0,e=u=o=null},c},debounce:function(n,r,t){var e,u,o,i,a,f=function(){var c=zn()-u;r>c?e=setTimeout(f,r-c):(e=null,t||(i=n.apply(a,o)),e||(o=a=null))},c=j((function(c){return a=this,o=c,u=zn(),e||(e=setTimeout(f,r),t&&(i=n.apply(a,o))),i}));return c.cancel=function(){clearTimeout(e),e=o=a=null},c},wrap:function(n,r){return rr(r,n)},negate:fr,compose:function(){var n=arguments,r=n.length-1;return function(){for(var t=r,e=n[r].apply(this,arguments);t--;)e=n[t].call(this,e);return e}},after:function(n,r){return function(){if(--n<1)return r.apply(this,arguments)}},before:cr,once:lr,findKey:sr,findIndex:vr,findLastIndex:hr,sortedIndex:yr,indexOf:gr,lastIndexOf:br,find:mr,detect:mr,findWhere:function(n,r){return mr(n,Dn(r))},each:jr,forEach:jr,map:_r,collect:_r,reduce:Ar,foldl:Ar,inject:Ar,reduceRight:xr,foldr:xr,filter:Sr,select:Sr,reject:function(n,r,t){return Sr(n,fr(qn(r)),t)},every:Or,all:Or,some:Mr,any:Mr,contains:Er,includes:Er,include:Er,invoke:Br,pluck:Nr,where:function(n,r){return Sr(n,Dn(r))},max:Ir,min:function(n,r,t){var e,u,o=1/0,i=1/0;if(null==r||"number"==typeof r&&"object"!=typeof n[0]&&null!=n)for(var a=0,f=(n=er(n)?n:jn(n)).length;a<f;a++)null!=(e=n[a])&&e<o&&(o=e);else r=qn(r,t),jr(n,(function(n,t,e){((u=r(n,t,e))<i||u===1/0&&o===1/0)&&(o=n,i=u)}));return o},shuffle:function(n){return Tr(n,1/0)},sample:Tr,sortBy:function(n,r,t){var e=0;return r=qn(r,t),Nr(_r(n,(function(n,t,u){return{value:n,index:e++,criteria:r(n,t,u)}})).sort((function(n,r){var t=n.criteria,e=r.criteria;if(t!==e){if(t>e||void 0===t)return 1;if(t<e||void 0===e)return-1}return n.index-r.index})),"value")},groupBy:Dr,indexBy:Rr,countBy:Fr,partition:Vr,toArray:function(n){return n?U(n)?i.call(n):S(n)?n.match(Pr):er(n)?_r(n,kn):jn(n):[]},size:function(n){return null==n?0:er(n)?n.length:nn(n).length},pick:Ur,omit:Wr,first:Lr,head:Lr,take:Lr,initial:zr,last:function(n,r,t){return null==n||n.length<1?null==r||t?void 0:[]:null==r||t?n[n.length-1]:$r(n,Math.max(0,n.length-r))},rest:$r,tail:$r,drop:$r,compact:function(n){return Sr(n,Boolean)},flatten:function(n,r){return ur(n,r,!1)},without:Kr,uniq:Jr,unique:Jr,union:Gr,intersection:function(n){for(var r=[],t=arguments.length,e=0,u=Y(n);e<u;e++){var o=n[e];if(!Er(r,o)){var i;for(i=1;i<t&&Er(arguments[i],o);i++);i===t&&r.push(o)}}return r},difference:Cr,unzip:Hr,transpose:Hr,zip:Qr,object:function(n,r){for(var t={},e=0,u=Y(n);e<u;e++)r?t[n[e]]=r[e]:t[n[e][0]]=n[e][1];return t},range:function(n,r,t){null==r&&(r=n||0,n=0),t||(t=r<n?-1:1);for(var e=Math.max(Math.ceil((r-n)/t),0),u=Array(e),o=0;o<e;o++,n+=t)u[o]=n;return u},chunk:function(n,r){if(null==r||r<1)return[];for(var t=[],e=0,u=n.length;e<u;)t.push(i.call(n,e,e+=r));return t},mixin:Yr,default:tn});return Zr._=Zr,Zr}));
|
@@ -0,0 +1,235 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'docurium'
|
3
|
+
require 'rugged'
|
4
|
+
|
5
|
+
class DocuriumTest < Minitest::Test
|
6
|
+
|
7
|
+
def setup
|
8
|
+
@dir = Dir.mktmpdir()
|
9
|
+
|
10
|
+
@repo = Rugged::Repository.init_at(@dir, :bare)
|
11
|
+
|
12
|
+
# Create an index as we would have read from the user's repository
|
13
|
+
index = Rugged::Index.new
|
14
|
+
headers = File.dirname(__FILE__) + '/fixtures/git2/'
|
15
|
+
Dir.entries(headers).each do |rel_path|
|
16
|
+
path = File.join(headers, rel_path)
|
17
|
+
next if File.directory? path
|
18
|
+
id = @repo.write(File.read(path), :blob)
|
19
|
+
index.add(:path => rel_path, :oid => id, :mode => 0100644)
|
20
|
+
end
|
21
|
+
|
22
|
+
@path = File.dirname(__FILE__) + '/fixtures/git2/api.docurium'
|
23
|
+
@doc = Docurium.new(@path, {}, @repo)
|
24
|
+
@data = @doc.parse_headers(index, 'HEAD')
|
25
|
+
end
|
26
|
+
|
27
|
+
def teardown
|
28
|
+
FileUtils.remove_entry(@dir)
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_can_parse
|
32
|
+
refute_nil @data
|
33
|
+
assert_equal [:files, :functions, :callbacks, :globals, :types, :prefix, :groups], @data.keys
|
34
|
+
files = %w(blob.h callback.h cherrypick.h commit.h common.h errors.h index.h object.h odb.h odb_backend.h oid.h refs.h repository.h revwalk.h signature.h tag.h tree.h types.h)
|
35
|
+
assert_equal files, @data[:files].map {|d| d[:file] }
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_can_parse_headers
|
39
|
+
keys = @data.keys.map { |k| k.to_s }.sort
|
40
|
+
assert_equal ['callbacks', 'files', 'functions', 'globals', 'groups', 'prefix', 'types'], keys
|
41
|
+
assert_equal 155, @data[:functions].size
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_can_extract_enum_from_define
|
45
|
+
skip("this isn't something we do")
|
46
|
+
assert_equal 41, @data[:globals].size
|
47
|
+
idxentry = @data[:types].find { |a| a[0] == 'GIT_IDXENTRY' }
|
48
|
+
assert idxentry
|
49
|
+
assert_equal 75, idxentry[1][:lineto]
|
50
|
+
# this one is on the last doc block
|
51
|
+
assert idxentry[1][:block].include? 'GIT_IDXENTRY_EXTENDED2'
|
52
|
+
# from an earlier block, should not get overwritten
|
53
|
+
assert idxentry[1][:block].include? 'GIT_IDXENTRY_UPDATE'
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_can_extract_structs_and_enums
|
57
|
+
skip("we don't auto-create enums, so the number is wrong")
|
58
|
+
assert_equal 25, @data[:types].size
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_can_find_type_usage
|
62
|
+
oid = @data[:types].find {|a| a[0] == 'git_oid' }
|
63
|
+
oid_returns = [
|
64
|
+
"git_commit_id",
|
65
|
+
"git_commit_parent_oid",
|
66
|
+
"git_commit_tree_oid",
|
67
|
+
"git_object_id",
|
68
|
+
"git_odb_object_id",
|
69
|
+
"git_oid_shorten_new",
|
70
|
+
"git_reference_oid",
|
71
|
+
"git_tag_id",
|
72
|
+
"git_tag_target_oid",
|
73
|
+
"git_tree_entry_id",
|
74
|
+
"git_tree_id"
|
75
|
+
]
|
76
|
+
assert_equal oid_returns, oid[1][:used][:returns]
|
77
|
+
oid_needs = [
|
78
|
+
"git_blob_create_frombuffer",
|
79
|
+
"git_blob_create_fromfile",
|
80
|
+
"git_blob_lookup",
|
81
|
+
"git_commit_create",
|
82
|
+
"git_commit_create_o",
|
83
|
+
"git_commit_create_ov",
|
84
|
+
"git_commit_create_v",
|
85
|
+
"git_commit_lookup",
|
86
|
+
"git_object_lookup",
|
87
|
+
"git_odb_exists",
|
88
|
+
"git_odb_hash",
|
89
|
+
"git_odb_open_rstream",
|
90
|
+
"git_odb_read",
|
91
|
+
"git_odb_read_header",
|
92
|
+
"git_odb_write",
|
93
|
+
"git_oid_allocfmt",
|
94
|
+
"git_oid_cmp",
|
95
|
+
"git_oid_cpy",
|
96
|
+
"git_oid_fmt",
|
97
|
+
"git_oid_mkraw",
|
98
|
+
"git_oid_mkstr",
|
99
|
+
"git_oid_pathfmt",
|
100
|
+
"git_oid_shorten_add",
|
101
|
+
"git_oid_shorten_free",
|
102
|
+
"git_oid_to_string",
|
103
|
+
"git_reference_create_oid",
|
104
|
+
"git_reference_create_oid_f",
|
105
|
+
"git_reference_set_oid",
|
106
|
+
"git_revwalk_hide",
|
107
|
+
"git_revwalk_next",
|
108
|
+
"git_revwalk_push",
|
109
|
+
"git_tag_create",
|
110
|
+
"git_tag_create_f",
|
111
|
+
"git_tag_create_fo",
|
112
|
+
"git_tag_create_frombuffer",
|
113
|
+
"git_tag_create_o",
|
114
|
+
"git_tag_lookup",
|
115
|
+
"git_tree_create_fromindex",
|
116
|
+
"git_tree_lookup",
|
117
|
+
"git_treebuilder_insert",
|
118
|
+
"git_treebuilder_write"
|
119
|
+
]
|
120
|
+
assert_equal oid_needs, oid[1][:used][:needs].sort
|
121
|
+
end
|
122
|
+
|
123
|
+
def test_can_parse_normal_functions
|
124
|
+
func = @data[:functions]['git_blob_rawcontent']
|
125
|
+
assert_equal "<p>Get a read-only buffer with the raw content of a blob.</p>\n", func[:description]
|
126
|
+
assert_equal 'const void *', func[:return][:type]
|
127
|
+
assert_equal ' the pointer; NULL if the blob has no contents', func[:return][:comment]
|
128
|
+
assert_equal 84, func[:line]
|
129
|
+
assert_equal 84, func[:lineto]
|
130
|
+
assert_equal 'blob.h', func[:file]
|
131
|
+
assert_equal 'git_blob *blob',func[:argline]
|
132
|
+
assert_equal 'blob', func[:args][0][:name]
|
133
|
+
assert_equal 'git_blob *', func[:args][0][:type]
|
134
|
+
assert_equal 'pointer to the blob', func[:args][0][:comment]
|
135
|
+
end
|
136
|
+
|
137
|
+
def test_can_parse_defined_functions
|
138
|
+
func = @data[:functions]['git_tree_lookup']
|
139
|
+
assert_equal 'int', func[:return][:type]
|
140
|
+
assert_equal ' 0 on success; error code otherwise', func[:return][:comment]
|
141
|
+
assert_equal 50, func[:line]
|
142
|
+
assert_equal 'tree.h', func[:file]
|
143
|
+
assert_equal 'id', func[:args][2][:name]
|
144
|
+
assert_equal 'const git_oid *', func[:args][2][:type]
|
145
|
+
assert_equal 'identity of the tree to locate.', func[:args][2][:comment]
|
146
|
+
end
|
147
|
+
|
148
|
+
def test_can_parse_function_cast_args
|
149
|
+
func = @data[:functions]['git_reference_listcb']
|
150
|
+
assert_equal 'int', func[:return][:type]
|
151
|
+
assert_equal ' 0 on success; error code otherwise', func[:return][:comment]
|
152
|
+
assert_equal 321, func[:line]
|
153
|
+
assert_equal 'refs.h', func[:file]
|
154
|
+
assert_equal 'repo', func[:args][0][:name]
|
155
|
+
assert_equal 'git_repository *', func[:args][0][:type]
|
156
|
+
assert_equal 'list_flags', func[:args][1][:name]
|
157
|
+
assert_equal 'unsigned int', func[:args][1][:type]
|
158
|
+
assert_equal 'callback', func[:args][2][:name]
|
159
|
+
assert_equal 'int (*)(const char *, void *)', func[:args][2][:type]
|
160
|
+
assert_equal 'Function which will be called for every listed ref', func[:args][2][:comment]
|
161
|
+
expect_comment =<<-EOF
|
162
|
+
<p>The listed references may be filtered by type, or using
|
163
|
+
a bitwise OR of several types. Use the magic value
|
164
|
+
<code>GIT_REF_LISTALL</code> to obtain all references, including
|
165
|
+
packed ones.</p>
|
166
|
+
|
167
|
+
<p>The <code>callback</code> function will be called for each of the references
|
168
|
+
in the repository, and will receive the name of the reference and
|
169
|
+
the <code>payload</code> value passed to this method.</p>
|
170
|
+
EOF
|
171
|
+
assert_equal expect_comment.split("\n"), func[:comments].split("\n")
|
172
|
+
end
|
173
|
+
|
174
|
+
def test_can_handle_bulleted_lists
|
175
|
+
type = @data[:types].find {|name, data| name == 'git_repository_init_options' }
|
176
|
+
refute_nil type
|
177
|
+
expect_comment = <<-EOF
|
178
|
+
<p>This contains extra options for <code>git_repository_init_ext</code> that enable
|
179
|
+
additional initialization features. The fields are:</p>
|
180
|
+
|
181
|
+
<ul>
|
182
|
+
<li>flags - Combination of GIT_REPOSITORY_INIT flags above.</li>
|
183
|
+
<li>mode - Set to one of the standard GIT_REPOSITORY_INIT_SHARED_...
|
184
|
+
constants above, or to a custom value that you would like.</li>
|
185
|
+
<li>workdir_path - The path to the working dir or NULL for default (i.e.
|
186
|
+
repo_path parent on non-bare repos). IF THIS IS RELATIVE PATH,
|
187
|
+
IT WILL BE EVALUATED RELATIVE TO THE REPO_PATH. If this is not
|
188
|
+
the "natural" working directory, a .git gitlink file will be
|
189
|
+
created here linking to the repo_path.</li>
|
190
|
+
<li>description - If set, this will be used to initialize the "description"
|
191
|
+
file in the repository, instead of using the template content.</li>
|
192
|
+
<li>template_path - When GIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE is set,
|
193
|
+
this contains the path to use for the template directory. If
|
194
|
+
this is NULL, the config or default directory options will be
|
195
|
+
used instead.</li>
|
196
|
+
<li>initial_head - The name of the head to point HEAD at. If NULL, then
|
197
|
+
this will be treated as "master" and the HEAD ref will be set
|
198
|
+
to "refs/heads/master". If this begins with "refs/" it will be
|
199
|
+
used verbatim; otherwise "refs/heads/" will be prefixed.</li>
|
200
|
+
<li>origin_url - If this is non-NULL, then after the rest of the
|
201
|
+
repository initialization is completed, an "origin" remote
|
202
|
+
will be added pointing to this URL.</li>
|
203
|
+
</ul>
|
204
|
+
EOF
|
205
|
+
assert_equal expect_comment, type[1][:comments]
|
206
|
+
end
|
207
|
+
|
208
|
+
def test_can_get_the_full_description_from_multi_liners
|
209
|
+
func = @data[:functions]['git_commit_create_o']
|
210
|
+
desc = "<p>Create a new commit in the repository using <code>git_object</code>\n instances as parameters.</p>\n"
|
211
|
+
assert_equal desc, func[:description]
|
212
|
+
end
|
213
|
+
|
214
|
+
def test_can_group_functions
|
215
|
+
groups = %w(blob cherrypick commit index lasterror object odb oid reference repository revwalk signature strerror tag tree treebuilder work)
|
216
|
+
assert_equal groups, @data[:groups].map {|g| g[0]}.sort
|
217
|
+
group, funcs = @data[:groups].first
|
218
|
+
assert_equal 'blob', group
|
219
|
+
assert_equal 6, funcs.size
|
220
|
+
end
|
221
|
+
|
222
|
+
def test_can_store_mutliple_enum_doc_sections
|
223
|
+
skip("this isn't something we do")
|
224
|
+
idxentry = @data[:types].find { |a| a[0] == 'GIT_IDXENTRY' }
|
225
|
+
assert idxentry, "GIT_IDXENTRY did not get automatically created"
|
226
|
+
assert_equal 2, idxentry[1][:sections].size
|
227
|
+
end
|
228
|
+
|
229
|
+
def test_can_parse_callback
|
230
|
+
cb = @data[:callbacks]['git_callback_do_work']
|
231
|
+
# we can mostly assume that the rest works as it's the same as for the functions
|
232
|
+
assert_equal 'int', cb[:return][:type]
|
233
|
+
end
|
234
|
+
|
235
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
#ifndef INCLUDE_git_blob_h__
|
2
|
+
#define INCLUDE_git_blob_h__
|
3
|
+
|
4
|
+
#include "common.h"
|
5
|
+
#include "types.h"
|
6
|
+
|
7
|
+
GIT_BEGIN_DECL
|
8
|
+
|
9
|
+
/**
|
10
|
+
* Perform a cherry-pick
|
11
|
+
*
|
12
|
+
* @param input dummy input
|
13
|
+
* @returns the usual
|
14
|
+
*/
|
15
|
+
GIT_EXTERN(int) git_cherrypick(char *input);
|
16
|
+
|
17
|
+
GIT_END_DECL
|
18
|
+
|
19
|
+
#endif
|
data/test/fixtures/git2/common.h
CHANGED
@@ -212,6 +212,45 @@ GIT_EXTERN(const char *) git_repository_path(git_repository *repo);
|
|
212
212
|
*/
|
213
213
|
GIT_EXTERN(const char *) git_repository_workdir(git_repository *repo);
|
214
214
|
|
215
|
+
/**
|
216
|
+
* Extended options structure for `git_repository_init_ext`.
|
217
|
+
*
|
218
|
+
* This contains extra options for `git_repository_init_ext` that enable
|
219
|
+
* additional initialization features. The fields are:
|
220
|
+
*
|
221
|
+
* * flags - Combination of GIT_REPOSITORY_INIT flags above.
|
222
|
+
* * mode - Set to one of the standard GIT_REPOSITORY_INIT_SHARED_...
|
223
|
+
* constants above, or to a custom value that you would like.
|
224
|
+
* * workdir_path - The path to the working dir or NULL for default (i.e.
|
225
|
+
* repo_path parent on non-bare repos). IF THIS IS RELATIVE PATH,
|
226
|
+
* IT WILL BE EVALUATED RELATIVE TO THE REPO_PATH. If this is not
|
227
|
+
* the "natural" working directory, a .git gitlink file will be
|
228
|
+
* created here linking to the repo_path.
|
229
|
+
* * description - If set, this will be used to initialize the "description"
|
230
|
+
* file in the repository, instead of using the template content.
|
231
|
+
* * template_path - When GIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE is set,
|
232
|
+
* this contains the path to use for the template directory. If
|
233
|
+
* this is NULL, the config or default directory options will be
|
234
|
+
* used instead.
|
235
|
+
* * initial_head - The name of the head to point HEAD at. If NULL, then
|
236
|
+
* this will be treated as "master" and the HEAD ref will be set
|
237
|
+
* to "refs/heads/master". If this begins with "refs/" it will be
|
238
|
+
* used verbatim; otherwise "refs/heads/" will be prefixed.
|
239
|
+
* * origin_url - If this is non-NULL, then after the rest of the
|
240
|
+
* repository initialization is completed, an "origin" remote
|
241
|
+
* will be added pointing to this URL.
|
242
|
+
*/
|
243
|
+
typedef struct {
|
244
|
+
unsigned int version;
|
245
|
+
uint32_t flags;
|
246
|
+
uint32_t mode;
|
247
|
+
const char *workdir_path;
|
248
|
+
const char *description;
|
249
|
+
const char *template_path;
|
250
|
+
const char *initial_head;
|
251
|
+
const char *origin_url;
|
252
|
+
} git_repository_init_options;
|
253
|
+
|
215
254
|
/** @} */
|
216
255
|
GIT_END_DECL
|
217
256
|
#endif
|
data/test/fixtures/git2/types.h
CHANGED
data/test/gen_test.rb
CHANGED
@@ -3,7 +3,7 @@ require 'docurium'
|
|
3
3
|
require 'docurium/cli'
|
4
4
|
require 'tempfile'
|
5
5
|
|
6
|
-
class GenTest <
|
6
|
+
class GenTest < Minitest::Test
|
7
7
|
|
8
8
|
# make sure we can read what we give the user
|
9
9
|
def test_read_generated_file
|
@@ -12,7 +12,7 @@ class GenTest < MiniTest::Unit::TestCase
|
|
12
12
|
Docurium::CLI.gen(file.path)
|
13
13
|
end
|
14
14
|
|
15
|
-
|
15
|
+
assert_raises(Rugged::RepositoryError) { Docurium.new file.path }
|
16
16
|
end
|
17
17
|
|
18
18
|
end
|
data/test/parser_test.rb
CHANGED
@@ -2,15 +2,19 @@ require 'minitest/autorun'
|
|
2
2
|
require 'docurium'
|
3
3
|
require 'pp'
|
4
4
|
|
5
|
-
class
|
5
|
+
class ParserTest < Minitest::Test
|
6
6
|
|
7
|
-
def
|
8
|
-
@parser
|
7
|
+
def teardown
|
8
|
+
@parser.cleanup! if @parser
|
9
9
|
end
|
10
10
|
|
11
11
|
# e.g. parse('git2/refs.h')
|
12
|
+
# contents is either a string (the contents of "path")
|
13
|
+
# or a hash of paths => contents
|
12
14
|
def parse(path, contents)
|
13
|
-
|
15
|
+
contents = [[path, contents]] if contents.is_a? String
|
16
|
+
@parser = Docurium::DocParser.new(contents)
|
17
|
+
@parser.parse_file(path)
|
14
18
|
end
|
15
19
|
|
16
20
|
def test_single_function
|
@@ -70,7 +74,7 @@ EOF
|
|
70
74
|
*/
|
71
75
|
int some_function(
|
72
76
|
char *string,
|
73
|
-
|
77
|
+
int len);
|
74
78
|
EOF
|
75
79
|
|
76
80
|
actual = parse(name, contents)
|
@@ -80,10 +84,10 @@ EOF
|
|
80
84
|
:tdef => nil,
|
81
85
|
:type => :function,
|
82
86
|
:name => 'some_function',
|
83
|
-
:body => "int some_function(char *string,
|
87
|
+
:body => "int some_function(char *string, int len);",
|
84
88
|
:description => ' Do something',
|
85
89
|
:comments => " More explanation of what we do\n\n ",
|
86
|
-
:sig => 'char *::
|
90
|
+
:sig => 'char *::int',
|
87
91
|
:args => [{
|
88
92
|
:name => 'string',
|
89
93
|
:type => 'char *',
|
@@ -91,15 +95,15 @@ EOF
|
|
91
95
|
},
|
92
96
|
{
|
93
97
|
:name => 'len',
|
94
|
-
:type => '
|
98
|
+
:type => 'int',
|
95
99
|
:comment => nil
|
96
100
|
}],
|
97
101
|
:return => {
|
98
102
|
:type => 'int',
|
99
103
|
:comment => ' an integer value'
|
100
104
|
},
|
101
|
-
:decl => "int some_function(char *string,
|
102
|
-
:argline => "char *string,
|
105
|
+
:decl => "int some_function(char *string, int len)",
|
106
|
+
:argline => "char *string, int len",
|
103
107
|
}]
|
104
108
|
|
105
109
|
assert_equal expected, actual
|
@@ -122,7 +126,7 @@ EOF
|
|
122
126
|
GIT_EXTERN(int) some_public_function(int val);
|
123
127
|
EOF
|
124
128
|
|
125
|
-
actual =
|
129
|
+
actual = parse(name_b, [[name_a, contents_a], [name_b, contents_b]])
|
126
130
|
# "Fix" the path so we remove the temp dir
|
127
131
|
actual[0][:file] = File.split(actual[0][:file])[-1]
|
128
132
|
|
@@ -192,7 +196,7 @@ EOF
|
|
192
196
|
:argline => "git_tree *tree"
|
193
197
|
}]
|
194
198
|
|
195
|
-
assert_equal
|
199
|
+
assert_equal expected, actual
|
196
200
|
|
197
201
|
end
|
198
202
|
|
@@ -377,7 +381,7 @@ EOF
|
|
377
381
|
:underlying_type => "int"
|
378
382
|
}]
|
379
383
|
|
380
|
-
assert_equal
|
384
|
+
assert_equal expected, actual
|
381
385
|
|
382
386
|
name = 'typeref.h'
|
383
387
|
contents = <<EOF
|
@@ -401,7 +405,7 @@ EOF
|
|
401
405
|
:comments => '',
|
402
406
|
}]
|
403
407
|
|
404
|
-
assert_equal
|
408
|
+
assert_equal expected, actual
|
405
409
|
|
406
410
|
|
407
411
|
end
|